嗨,我有一个模型,这是基于这个https://github.com/igormq/asr-study/tree/keras-2,这是能够保存正常,但无法加载(无论是完全模式或json/权重),因为事实是损失没有正确定义。
inputs = Input(name='inputs', shape=(None, num_features))
...
o = TimeDistributed(Dense(num_hiddens))(inputs)
# Output layer
outputs = TimeDistributed(Dense(num_classes))(o)
# Define placeholders
labels = Input(name='labels', shape=(None,), dtype='int32', sparse=True)
inputs_length = Input(name='inputs_length', shape=(None,), dtype='int32')
# Define a decoder
dec = Lambda(ctc_utils.decode, output_shape=ctc_utils.decode_output_shape,
arguments={'is_greedy': True}, name='decoder')
y_pred = dec([output, inputs_length])
loss = ctc_utils.ctc_loss(output, labels, input_length)
model = Model(input=[inputs, labels, inputs_length], output=y_pred)
model.add_loss(loss)
opt = Adam(lr=args.lr, clipnorm=args.clipnorm)
# Compile with dummy loss
model.compile(optimizer=opt, loss=None, metrics=[metrics.ler])这将编译并运行(请注意,它使用了add_loss函数,该函数没有很好的文档记录)。它甚至可以被说服通过一些工作来保存-正如这篇文章所暗示的(https://github.com/fchollet/keras/issues/5179),你可以通过强制完成图形来保存它。为此,我制作了一个虚拟的lambda损失函数,以引入不完全包含在图形中的输入,现在这似乎起作用了。
#this captures all the dangling nodes so will now save
fake_dummy_loss = Lambda(fake_ctc_loss,output_shape(1,),name=ctc)([y_pred,labels,inputs_length])
def fake_ctc_loss(args):
return tf.Variable(tf.zeros([1]),name="fakeloss")我们可以像这样将其添加到模型中:
model = Model(input=[inputs, labels, inputs_length], output=[y_pred, fake_dummy_loss])现在尝试加载时的损失表明它不能加载,因为它缺少损失函数(我猜这是因为尽管使用了add_loss,但它被设置为None )。
感谢这里的任何帮助
发布于 2018-05-03 07:42:36
我在我的一个项目中遇到了类似的问题,在这个项目中,add_loss被用来手动向我的模型添加自定义损失函数。您可以在这里看到我的模型:Keras Loss Function with Additional Dynamic Parameter正如您所发现的,使用load_model加载模型失败,并抱怨丢失了损失函数。
无论如何,我的解决方案是保存和加载模型的权重,而不是整个模型。Model类有一个save_weights方法,这里讨论:https://keras.io/models/about-keras-models/。同样,还有一个load_weights方法。使用这些方法,您应该能够很好地保存和加载模型。缺点是您必须预先定义模型,然后加载权重。在我的项目中,这不是一个问题,只涉及一个小的重构。
希望这能有所帮助。
https://stackoverflow.com/questions/45702765
复制相似问题