Вычисление коэффициентов Пирсона в модели keras, встреченной с помощью AttributeError: объект 'NoneType' не имеет атрибута '_inbound_nodes' - PullRequest
0 голосов
/ 15 ноября 2018

Я использую коэффициенты корреляции Пирсона в качестве входных данных модели MLP и сталкиваюсь с проблемой при создании модели.

Я обновил и запустил свой код в соответствии с положительным комментарием сегодня , заключающим в себе функцию внутри лямбда-слоя, в то время как та же самая ошибка все еще происходит. Я думал, что исправил ошибки сегодня упомянутых. Ниже мой обновленный код:

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):

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

1 Ответ

0 голосов
/ 15 ноября 2018

Вы должны обернуть свою функцию в слой Lambda, чтобы Keras смог отследить его и дополнить возвращенный тензор (ы) необходимой информацией. Для этого вам также нужно изменить определение вашей функции, так как он должен принимать список тензоров в качестве входных данных:

def cal_cor(x):
    a, b = x

    # the rest is the same ...

Затем определите лямбда-слой для этого:

cor_layer = Lambda(cal_cor)

, а затем используйте его так:

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))

Обратите внимание, что для добавления нам также необходимо использовать слой Add (from keras.layers import Add).

...