这是使用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中进行,这样的乘法也不能处理相同的错误信息。
我之所以要在网络输入层之后,而不是在输入层之前,对输入数据做掩蔽处理,是因为我需要输入图像的完整数据(包括被蒙面数据),才能进行混乱的损失计算。
发布于 2018-12-12 13:31:13
您正在将您的张量操作到一个层之外。(获取切片也是操作)
您需要将切片input_img[:,:,:,:,:,0]和input_img[:,:,:,:,:,1] 放在的一个层中。
masked = Lambda(lambda x: x[:,:,:,:,:,0]*x[:,:,:,:,:,1])(input_img)发布于 2018-12-12 13:45:44
正如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)
# ...https://stackoverflow.com/questions/53743704
复制相似问题