поэлементное умножение - у объекта 'NoneType' нет атрибута '_inbound_nodes' - PullRequest
0 голосов
/ 12 декабря 2018

Это проблема с кодом Keras, использующим Tensorflow.

У меня есть простая сеть, где мне нужно сделать поэлементное умножение сразу после ввода.Эта часть кода показана ниже.Я всегда получаю сообщение об ошибке:

*** AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes'

Мой код:

    input_img = Input(shape=(256, 256, 2, 1, 2))
    masked = Lambda(lambda x: tf.multiply(x[0], x[1]))([input_img[:,:,:,:,:,0], input_img[:,:,:,:,:,1]])
    conv1 = Conv3D(1, (5, 5, 2), padding='same',  activation=activation, kernel_regularizer=regularizers.l2(1e-9))(masked)
    net_head = Model(inputs=input_img, outputs=conv1)

Я уже использовал лямбда-слойЯ так запутался, что вызвало эту проблему.Размерность входных данных хорошо соответствует модели, так что это не должно быть проблемой.

Кто-нибудь имеет подсказку?

Это поэлементное умножение фактически маскирует некоторые пиксели в нули.В приведенном выше коде маска объединяется в дополнительном последнем измерении с входной переменной.В качестве альтернативы я также попытался использовать переменную, исключающую маску, например, input_mask, вместо включения ее в качестве дополнительного последнего измерения в input_image, чтобы выполнить умножение, которое не работало ни с той же информацией об ошибке.

Причина, по которой я должен выполнить процесс маскирования входных данных после входного слоя сети, а не перед входным, состоит в том, что мне нужны полные данные (включая маскировку) входного изображения при расчете потерьв случайном порядке

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Как указывал Даниэль , вы не можете удалять срезы из слоя, потому что это генерирует "сырые" тензоры без аннотаций, которые использует Keras.Если по какой-то причине вы все еще хотите иметь слой с двумя входами, вы можете просто инкапсулировать слои в слои:

input_img = Input(shape=(256, 256, 2, 1, 2))
slice0 = Lambda(lambda x: x[:, :, :, :, :, 0])(input_img)
slice1 = Lambda(lambda x: x[:, :, :, :, :, 1])(input_img)
masked = Lambda(lambda x: tf.multiply(x[0], x[1]))([slice0, slice1])
net_head = Model(inputs=input_img, outputs=masked)
# ...
0 голосов
/ 12 декабря 2018

Вы управляете своими тензорами вне слоя.(Получение срезов - это тоже операции)

Вам потребуется взять кусочки input_img[:,:,:,:,:,0] и input_img[:,:,:,:,:,1] внутри слоя.

masked = Lambda(lambda x: x[:,:,:,:,:,0]*x[:,:,:,:,:,1])(input_img)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...