Python Keras Lambda CTC无法获取要加载的模型

Python Keras Lambda CTC无法获取要加载的模型,python,keras,keras-2,Python,Keras,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

您好,我有一个基于此的模型,它可以正常保存,但无法加载(完整模式或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函数,该函数没有很好的文档记录)。它甚至可以通过一点工作来保存——正如本文所提示的(),您可以通过强制完成图形来保存它。我通过制作一个虚拟的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])
现在,当尝试加载时,loss表示它无法加载,因为它缺少loss函数(我猜这是因为尽管使用了add_loss,但它被设置为None)


这里的任何帮助都值得赞赏

我在我的一个项目中遇到了一个类似的问题,
add\u loss
用于手动向我的模型中添加自定义损失函数。您可以在这里看到我的模型:正如您所发现的,用
load\u model
加载模型失败,抱怨丢失了一个损失函数

无论如何,我的解决方案是保存和加载模型的权重,而不是整个模型。
model
类有一个
save\u weights
方法,这里讨论了这个方法:同样,也有一个
load\u weights
方法。使用这些方法,您应该能够很好地保存和加载模型。缺点是必须预先定义模型,然后加载权重。在我的项目中,这不是问题,只涉及一个小的重构


希望这能有所帮助。

好问题,@robmsmt。你是不是碰巧找到了解决办法?