【发布时间】:2019-09-11 21:33:42
【问题描述】:
我有一个自定义损失函数,它将模型的输入作为参数之一。如果我在训练的同一会话中加载,我可以使用this 技术加载它。
def custom_loss(inputs):
def loss(y_true, y_pred):
return ...
return loss
inputs = keras.layers.Input(shape=(...))
y = keras.layers.Activation('tanh')(inputs)
model = keras.models.Model(inputs=inputs, outputs=y)
model.compile(loss=custom_loss(inputs), optimizer='Adam')
model.fit(...)
model.save('mymodel.h5')
load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs})
但是,当我尝试在以后的会话中加载模型时遇到问题,因为这次我无法访问原始输入张量。如果我创建了一个新的输入占位符,那么模型需要两组不同的输入并且我会出错。
inputs = keras.layers.Input(shape=(...))
load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs)})
有没有解决这个问题的好方法?归根结底的问题是输入尚未反序列化,因此无法将它们传递给自定义对象。
我不想只保存权重并创建具有相同权重的新模型,因为我失去了优化器状态。
【问题讨论】:
-
我不知道它是否对你有帮助,但我确实看到你的代码中有错字
load_model('mymodel.h5', custom_objects={'custom_loss': custom_loss(inputs)})(括号)
标签: python tensorflow keras