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

时间:2020-01-14 07:52:16

标签: python keras neural-network conv-neural-network keras-layer

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

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脚本中加载模型,因此没有“ label”输入对象。 我该如何克服?

1 个答案:

答案 0 :(得分:0)

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

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

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