【问题标题】:keras dosen't load the model and weights when using checkpoint使用检查点时,keras 不会加载模型和权重
【发布时间】:2018-03-28 12:08:32
【问题描述】:

我正在使用 keras 构建深度自动编码器。我使用它的检查点来加载模型和权重,但结果始终是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"))

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用save_weights_only=True。没有这个,整个模型将被保存,而不仅仅是权重。为了能够加载权重,您必须像这样保存权重:

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

    【讨论】:

      【解决方案2】:

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

      所以减肥可能效果很好,只是你的解释是错误的。

      【讨论】:

      • 好的,我怎样才能访问包含权重的文件并再次使用?而且我想知道:如果正确保存了权重,是否有必要保留自动编码器训练过程的脚本,因为我在同一个文件中工作,并且我不希望每次运行脚本时自动编码器都会启动再次训练??
      • @Mari 您只需使用 load_model 从 .hdf5 文件加载模型和权重。
      【解决方案3】:

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

      预期行为

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

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

      为清楚起见

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

      【讨论】:

      • 好的,我怎样才能访问包含权重的文件并再次使用?而且我想知道:如果正确保存了权重,是否有必要保留自动编码器训练过程的脚本,因为我在同一个文件中工作,并且我不希望每次运行脚本时自动编码器都会启动再次训练??
      • 不,你根本不需要训练脚本。在单独的脚本(通常是测试脚本或预测脚本)中,只是不要fit 模型,做你所做的一切并直接从h5 文件加载权重,而不是调用fit 函数
      • 我明白了。但现在的问题是,当我加载权重以获取编码数据层(因为我正在使用自动编码器)对其进行一些操作时,我每次都会得到不同的结果,我认为这意味着权重不是固定的并正确保存!你对此有什么解释和解决办法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2017-05-11
      相关资源
      最近更新 更多