计算遇到AttributeError的keras模型中的pearson系数:“NoneType”对象没有属性“\u inbound_nodes”

2024-04-26 09:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

本文采用pearson相关系数作为MLP模型的输入特征,在建立模型时遇到了一些问题。在

我已经根据今天的好评更新并运行了我的代码,即将函数包装在Lambda层中,但是同样的错误仍然发生。我想我已经修正了今天提到的错误。以下是我更新的代码:

from keras.layers import Conv2D, Input, Lambda, MaxPooling2D, BatchNormalization, Add, Flatten, Dense, Concatenate
from keras.models import Model, Sequential
import keras.backend as K

def cal_cor(x):
    a, b = x
    assert a.shape[1] == b.shape[1], 'lengths not compatible'

    a_mean = K.mean(a)
    b_mean = K.mean(b)
    a_norm = a - a_mean
    b_norm = b - b_mean
    numerator = a_norm * b_norm

    a_var = K.square(a_norm)
    b_var = K.square(b_norm)
    denominator = (a_var * b_var) ** 0.5

    return numerator / denominator

def cnn_with_pearson():

    # Pearson part
    cor_layer = Lambda(function=cal_cor, name='correlation_layer')

    cors = []
    for i in range(28):
        cor_added = []
        for j in range(28):
            if i == j:
                continue
            cor_added.append( cor_layer( [input[:, i, :, 0], input[:, j, :, 0]] ) )
        cors.append(Add()(cor_added))

    con = Concatenate()(cors)
    f = Flatten()(K.expand_dims(con, -1))
    d = Dense(units=10, activation='softmax')(f)
    model = Model(inputs=input, outputs=d)

    return model

model = cnn_with_pearson()

model = Model(inputs=input, outputs=d)行中发生错误:

^{pr2}$

Tags: lambdaimportlayernormaddedinputmodelvar
1条回答
网友
1楼 · 发布于 2024-04-26 09:15:34

您必须将函数包装在^{}层中,以便Keras能够跟踪它并用必要的信息扩充它返回的张量。为此,还需要修改函数的定义,因为它必须以张量列表作为输入:

def cal_cor(x):
    a, b = x

    # the rest is the same ...

然后为其定义Lambda层:

^{pr2}$

然后像这样使用它:

cor_added = []
for j in range(28):
    if i == j:
        continue
    cor_added.append(cor_layer(input[:, i, :, 0], input[:, j, :, 0]))

cors.append(Add()(cor_added))

注意,为了添加,我们还需要使用^{}层(from keras.layers import Add)。在

相关问题 更多 >