Python 凯拉斯>;加载保存的模型后始终保持相同的预测值
我正在通过Python 凯拉斯>;加载保存的模型后始终保持相同的预测值,python,tensorflow,keras,Python,Tensorflow,Keras,我正在通过keras和tensorflow后端培训一些模型 当我在同一个对象上进行训练后立即调用predict时,它工作良好,并为不同的输入提供不同的值。但是当我将模型保存到文件中,然后从另一个python会话加载它时,predict总是为不同的输入返回相同的值 我使用ModelCheckpoint保存模型,然后使用load\u model加载模型。我还尝试使用to_json和model_from_json函数将架构分别保存和加载到json文件中。示例代码: 保存部分 with open("mo
keras
和tensorflow
后端培训一些模型
当我在同一个对象上进行训练后立即调用predict时,它工作良好,并为不同的输入提供不同的值。但是当我将模型保存到文件中,然后从另一个python
会话加载它时,predict
总是为不同的输入返回相同的值
我使用ModelCheckpoint
保存模型,然后使用load\u model
加载模型。我还尝试使用to_json
和model_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')
有什么办法解决这个问题吗?有什么我遗漏的吗?不幸的是,许多人(像我一样)一直在抱怨影响保存权重
和加载权重
功能的问题
我最终避免使用这些函数。如果我想加载/存储我的模型,我只需执行以下操作:
from keras.models import load_model
trained_model.save(file_path)
loaded_model = load_model(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)
save
功能可以保存您的权重,还可以保存您的网络结构和优化器的状态(它确保您可以将培训模型保持在暂停的位置)。keras模型保存/加载有两种方法(我觉得使用这两种方法比较方便)。保存模型结构和权重model.save(文件路径)
并仅保存模型权重model.save_权重(文件路径)
。
因此,我保存/加载模型如下:
from keras.models import load_model
trained_model.save(file_path)
loaded_model = load_model(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\u weights(file\u path,by\u name=True)
允许您将权重加载到不同的结构中,其中有一些层名称是相同的。我也遇到了同样的问题,我通过将固定种子设置为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可能需要不同的方法来设定种子 您能否禁用
save\u best\u only
选项并检查是否有任何更改。数据预处理如何?是一样的吗?如果数据没有进行缩放,那么对于所有示例,通常都会得到相同的预测。@MarcinMożejko是的,对于预处理,我使用scikit learn的StandardScaler()
。我使用joblib.dump()
和joblib.load()
函数将定标器保存并加载到一个文件中。对此有任何更新吗?我遇到了同样的问题,我不知道如何解决它。@MarcinMożejko是对的,数据预处理代码中有一个bug。我的数据中有非常大的数字,由于这个错误,它们没有被清除/缩放,这导致了问题中描述的行为。我尝试使用您提到的方法,但它再次给出了相同的结果。