Keras自定义损失函数错误:InvalidArgumentError:ConcatOp

时间:2018-12-09 22:08:54

标签: python tensorflow keras deep-learning

我正在建立一个模型来识别两个图像是否属于同一类。为此,我首先使用CNN对两个图像进行编码,然后比较两个嵌入的“相似性”(在此示例中为内积)。

''' build model '''    
conv_base = Xception_greyscale((256,256,1),'max',False)
feature_model = models.Sequential()
feature_model.add(conv_base)
feature_model.add(layers.Dense(1024,activation=tf.sigmoid))

img1 = layers.Input(shape=(256,256,1))
img2 = layers.Input(shape=(256,256,1))
feature1 = feature_model(img1)
feature2 = feature_model(img2)

output = layers.Lambda(lambda features: tf.reduce_mean(features[0]*features[1],axis=1))([feature1,feature2])
model = models.Model([img1,img2],output)

我的y_true将是一个零和一的向量(一个例子属于同一类)。在损失函数中,将鼓励y_pred增大正例,减小负例

def loss_(y_true,y_pred):
    return -1 * y_true * y_pred + (1-y_true) * y_pred

model.compile(loss=loss_,
optimizer=optimizers.Adam(lr=1e-3),
metrics=[loss_])

但是,当我进行fit / train_on_batch / evaluate但无法预测时,出现以下错误。 model.train_on_batch(data[0],data[1]),其中data[0]是列表[img1,img2]img1的形状为(batch,256,256,1),data[1]是形状的1d numpy数组(批次)。

,然后检查我的输出是形状的张量(批处理)。

我不了解错误消息,因为我什至没有concat。一定是Keras在内部做的事情,这使我很难调试。

谢谢您的帮助!

InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [2,1] vs. shape[1] = [1,1]
 [[{{node loss_4/lambda_1_loss/broadcast_weights/assert_broadcastable/is_valid_shape/has_valid_nonscalar_shape/has_invalid_dims/concat}} = ConcatV2[N=2, T=DT_INT32, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:GPU:0"](loss_4/lambda_1_loss/broadcast_weights/assert_broadcastable/is_valid_shape/has_valid_nonscalar_shape/has_invalid_dims/ExpandDims, loss_4/lambda_1_loss/broadcast_weights/assert_broadcastable/is_valid_shape/has_valid_nonscalar_shape/has_invalid_dims/ones_like, loss_4/lambda_1_loss/broadcast_weights/assert_broadcastable/is_valid_shape/has_valid_nonscalar_shape/has_invalid_dims/concat/axis)]]

0 个答案:

没有答案