我正在使用keras
后端通过tensorflow
训练一些模型。
当我在同一个对象的训练后立即调用预测时,它可以正常工作,并为不同的输入提供不同的值。但是当我将模型保存到文件中,然后从另一个python
会话加载它时,predict
总是为不同的输入返回相同的值。
我使用ModelCheckpoint
保存模型,然后使用load_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')
有什么想法可以解决这个问题?有什么我想念的吗?
答案 0 :(得分:1)
不幸的是,许多人(像我一样)一直抱怨keras bug会影响save_weights
和load_weights
功能。
我最终避免使用这些功能。如果我想加载/存储我的模型,我只需执行以下操作:
from keras.models import load_model
trained_model.save(file_path)
loaded_model = load_model(file_path)
save
函数可以保存您的权重,还可以保存您的网络结构和优化程序的状态(它可以确保您可以从准确的位置继续训练模型)。
答案 1 :(得分: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 :(得分:0)
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)
允许您将权重加载到具有共同层名称的不同结构中。