【问题标题】:keras > always the same prediction value after loading saved modelkeras > 加载保存的模型后总是相同的预测值
【发布时间】:2018-06-30 10:46:25
【问题描述】:

我正在通过kerastensorflow 后端训练一些模型。

当我在对同一对象进行训练后立即调用 predict 时,它可以正常工作并为不同的输入提供不同的值。但是当我将模型保存到文件中,然后从另一个 python 会话中加载它时,predict 总是为不同的输入返回相同的值。

我使用ModelCheckpoint 保存模型,然后使用load_model 进行加载。我还尝试使用 to_jsonmodel_from_json 函数将架构分别保存和加载到 json 文件中。示例代码:

保存部分

with open("model.json", "w") as textFile:
   print(model.to_json(), file = textFile)

model.fit(X_train, y_train, epochs=iterationCount, batch_size=64, validation_split=0.2, callbacks = [ModelCheckpoint(filepath='model.h5', verbose=0, save_best_only=True)])

加载部分

with open('model.json') as json_file:
    model = model_from_json(json_file.read())

model.load_weights('model.h5')

有什么想法可以解决这个问题吗?我有什么遗漏的吗?

【问题讨论】:

  • 能否禁用save_best_only 选项并检查是否有任何变化。
  • 数据预处理怎么样?是一样的吗?如果数据未按比例缩放,您通常会为所有示例获得相同的预测。
  • @MarcinMożejko 是的,我使用 scikit learn 的 StandardScaler() 进行预处理。我使用joblib.dump()joblib.load() 函数将缩放器保存并加载到文件中。
  • 这有什么更新吗?我也遇到了同样的问题,不知道怎么解决。
  • @MarcinMożejko 是对的,数据预处理代码中存在错误。我的数据中有非常大的数字,并且由于该错误,它们没有被清除/缩放,这导致了问题中描述的行为。

标签: python tensorflow keras


【解决方案1】:

我遇到了同样的问题,我通过将固定种子设置为 tensorflow、numpy 和 python 来解决。

import tensorflow as tf
import numpy as np
import random as python_random
tf.random.set_random_seed(42)
np.random.seed(42)
python_random.seed(42)

小心!不同版本的 tensorflow 可能需要不同的方式来设置种子!

【讨论】:

    【解决方案2】:

    keras 模型保存/加载有两种方式(两种方式我觉得很舒服)。保存模型结构和权重model.save(file_path),只保存模型权重model.save_weights(file_path)。 所以我保存/加载模型如下:

    from keras.models import load_model
    trained_model.save(file_path)
    loaded_model = load_model(file_path)
    
    trained_model.save_weights(file_path)
    # We have to define model first before loading weights
    trained_model.load_weights(file_path)
    

    在这里,load_weights(file_path, by_name=True) 允许您将权重加载到具有一些共同层名称的不同结构中。

    【讨论】:

      【解决方案3】:

      不幸的是,很多人(比如我)一直在抱怨影响save_weightsload_weights 功能的keras bug

      我最终避免使用这些功能。如果我想加载/存储我的模型,我只需执行以下操作:

      from keras.models import load_model
      
      trained_model.save(file_path)
      loaded_model = load_model(file_path)
      

      save 函数可以保存您的权重,还可以保存您的网络结构和优化器的状态(它确保您可以将训练模型从您暂停的确切位置保留)。

      【讨论】:

      • 我尝试使用您提到的方法,但它再次给出了相同的结果。
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2018-08-05
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多