根据输入加载具有自定义损失的 keras 模型

Posted

技术标签:

【中文标题】根据输入加载具有自定义损失的 keras 模型【英文标题】:Loading a keras model with custom loss based on input 【发布时间】:2020-04-30 22:12:41 【问题描述】:

我有一个自定义损失,它使用模型的一个输入。

def closs(labels,latent_dim):
  def loss(y_true,y_pred):
    return metric_learning.contrastive_loss(labels=labels,
                        embeddings_anchor=y_pred[:,:latent_dim],
                        embeddings_positive=y_pred[:,latent_dim:])
return loss

其中标签是模型的输入。模型架构为:

def build_model():
  left_input = Input(shape=(2900,1))
  right_input = Input(shape=(2900,1))
  label = Input(shape=(1,))

  encoder = build_encoder()

  left_embed = encoder(left_input)
  right_embed = encoder(right_input)

  embeds = Concatenate()([left_embed,right_embed])

  model = Model(inputs=[left_input,right_input,label],outputs=[embeds])
  return model, label

然后我使用返回的“标签”来编译模型:

model,label = build_model()
model.compile(optimizer='adam',loss=closs(label,256))

但是当我尝试加载模型时,我必须将此损失作为 custom_object 传递,所以是这样的:

model = load_model('model/cl_model.h5',custom_objects='loss':closs(xyz,256))

问题是我在不同的 python 脚本中加载模型,所以我没有“标签”输入对象。 我该如何克服这个问题?

【问题讨论】:

【参考方案1】:

您是在使用权重来重新训练模型还是只是为了预测新数据? 在仅预测的情况下,您可以使用

model.load_weights('model/cl_model.h5') 

定义模型后,您不必传递损失函数,因为它仅用于预测。

【讨论】:

我想重新训练模型

以上是关于根据输入加载具有自定义损失的 keras 模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义损失函数加载 Keras 模型?

如何为 keras 模型使用 tensorflow 自定义损失?

Keras 中具有样本权重的自定义损失函数

Keras 中基于输入数据的自定义损失函数

Keras CIFAR-10分类 自定义simple CNN篇

在具有条件的 keras 中实现自定义损失函数