我报该错误是因为:
triplet_loss = Lambda(self.cal_triplet_loss, name="triplet")(feature)
sim_model.compile(optimizer=optimizer,
loss={
"triplet": lambda y_true, y_pred: y_pred,
"output": "sparse_categorical_crossentropy",},
metrics=["accuracy"])
模型编译时, “triplet”层的输出是1d
的,而metrics的计算在源码中需要至少两个维度。解决方案是
,给triplet层的输出加一个维度从(batch_size, )
→(batch_size, 1)
。
另一个解决方案就是去掉metrics,自己实现训练过程的指标计算(继承 keras.callbacks.Callback
,实现其中的on_epoch_end,
on_batch_end
)。