使用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中的附加最后一个维度来进行乘法,这对相同的错误信息均无效。
我必须在网络输入层之后而不是在输入层之前对输入数据进行遮罩处理的原因是,我需要丢失输入图像的完整数据(包括被遮罩)随机播放计算。
答案 0 :(得分:1)
您正在层之外操作张量。 (获取切片也是操作)
您需要将切片input_img[:,:,:,:,:,0]
和input_img[:,:,:,:,:,1]
放在内部。
masked = Lambda(lambda x: x[:,:,:,:,:,0]*x[:,:,:,:,:,1])(input_img)
答案 1 :(得分:1)
正如Daniel所指出的那样,您不能从层中切出切片,因为这会生成“原始”张量,而没有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)
# ...