【发布时间】:2017-08-15 23:01:33
【问题描述】:
您好,我有一个基于 https://github.com/igormq/asr-study/tree/keras-2 的模型,它可以保存但由于未正确定义损失而无法加载(完整模式或 json/weights)。
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。
这里的任何帮助表示赞赏
【问题讨论】:
-
好问题,@robmsmt。您是否偶然找到了解决方案?