こんにちは、私はこの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 関数を使用していることに注意してください)。ちょっとした作業で保存することを確信することさえできます. ダミーのラムダ損失関数を作成して、グラフの一部ではない入力を取り込むことでこれを行いましたが、これは機能しているように見えます。
#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に設定されているためだと思います.
ここで何か助けていただければ幸いです