使用检查点时,keras不会加载模型和权重

时间:2018-03-28 12:08:32

标签: python deep-learning keras data-science checkpoint

我正在使用keras构建深度自动编码器。我用它的checkpointer来加载模型和权重,但结果始终是None,我认为这意味着检查点不能正常工作而且不能保存权重。 以下是我如何进行的代码:

checkpointer = ModelCheckpoint(filepath="weights.best.h5",
                               verbose=0,
                               save_best_only=True)
tensorboard = TensorBoard(log_dir='/tmp/autoencoder',
                          histogram_freq=0,
                          write_graph=True,
                          write_images=True)
input_enc = Input(shape=(input_size,))
hidden_1 = Dense(hidden_size1, activation='relu')(input_enc)
hidden_11 = Dense(hidden_size2, activation='relu')(hidden_1)
code = Dense(code_size, activation='relu')(hidden_11)
hidden_22 = Dense(hidden_size2, activation='relu')(code)
hidden_2 = Dense(hidden_size1, activation='relu')(hidden_22)
output_enc = Dense(input_size, activation='tanh')(hidden_2)
autoencoder_yes = Model(input_enc, output_enc)

autoencoder_yes.compile(optimizer='adam',
                         loss='mean_squared_error', 
                         metrics=['accuracy'])
history_yes = autoencoder_yes.fit(df_noyau_norm_y, df_noyau_norm_y,
                               epochs=200,
                                batch_size=batch_size,
                                shuffle = True,
                                validation_data=(df_test_norm_y, df_test_norm_y),
                                verbose=1, 
                                callbacks=[checkpointer, tensorboard]).history

autoencoder_yes.save_weights("weights.best.h5")
print(autoencoder_yes.load_weights("weights.best.h5"))

有人可以帮我找到解决问题的方法吗? 感谢

3 个答案:

答案 0 :(得分:2)

你应该使用save_weights_only=True。如果没有这个,整个模型不仅仅保存了权重。为了能够加载权重,你必须保存这样的权重:

checkpointer = ModelCheckpoint(filepath="weights.best.h5",
                           verbose=0, save_weights_only=True,
                           save_best_only=True)

答案 1 :(得分:2)

不,您对load_weights返回无的解释是不正确的。加载权重是一个过程,它不返回任何内容,如果将过程的返回值赋给变量,它将获得None的值。

因此,减轻重量可能正常,只是你的解释是错误的。

答案 2 :(得分:0)

这是预期的行为而不是错误。 autoencoder_yes.load_weights("weights.best.h5")实际上并没有返回任何内容,因此如果您尝试打印此函数的输出,获取None作为输出。

预期行为

在您提供的代码中,您已经训练了模型并保存了权重。因此,autoencoder_yes是一个具有微调权重的keras.Model对象。

如果您再次加载已保存的权重,则在同一脚本中,不会发生任何事情,您保存的权重将再次加载。

为清晰起见

从另一个新脚本开始,构建相同的模型体系结构并从h5文件重新加载权重,然后进行一些预测。在这种情况下,它将默默加载预先训练的权重并根据该预测进行预测。