keras>加载保存的模型后,始终保持相同的预测值

时间:2018-01-21 19:28:24

标签: python tensorflow keras

我正在使用keras后端通过tensorflow训练一些模型。

当我在同一个对象的训练后立即调用预测时,它可以正常工作,并为不同的输入提供不同的值。但是当我将模型保存到文件中,然后从另一个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')

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

3 个答案:

答案 0 :(得分:1)

不幸的是,许多人(像我一样)一直抱怨keras bug会影响save_weightsload_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)允许您将权重加载到具有共同层名称的不同结构中。