按元素乘法 - 'NoneType' 对象没有属性 '_inbound_nodes'

element-wise multiplication - 'NoneType' object has no attribute '_inbound_nodes'

使用Tensorflow的Keras代码有问题

我有一个简单的网络,我需要在输入后立即进行逐元素乘法。这部分代码如下所示。我总是得到错误:

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

我已经使用了 Lambda 层,所以我很困惑是什么导致了这个问题。输入的维度很适合模型,所以这应该不是问题。

有人知道吗?

这种逐元素乘法实际上是将一些像素屏蔽为零。在上面的代码中,掩码在附加的最后一个维度中连接到输入变量中。 或者,我也尝试使用掩码专用变量,例如input_mask,而不是将其作为附加的最后一个维度包含在 input_image 中,以进行乘法运算,但同样的错误信息也不起作用。

之所以要在网络的输入层之后而不是在输入层之前对输入数据进行掩蔽处理,是因为我需要输入图像的完整数据(包括被掩蔽的)在打开洗牌的损失计算中。

您在层外操作张量。 (获取切片也是操作)

您需要将切片 input_img[:,:,:,:,:,0]input_img[:,:,:,:,:,1] 放在 层中。

masked = Lambda(lambda x: x[:,:,:,:,:,0]*x[:,:,:,:,:,1])(input_img)

正如 所指出的,您不能从层中取出切片,因为那样会生成 "raw" 张量,而没有 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)
# ...