我正在尝试加载已保存的模型,以便在重新启动内核后将其用于预测。虽然保存模型似乎有效,但加载似乎没有问题。继承人我所做的:
我使用Keras重新训练了VGG16模型:
vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()
for layer in vgg16_model.layers[:-1]:
model.add(layer)
model.layers.pop()
for layer in model.layers:
layer.trainable = False
model.add(Dense(26, activation='softmax'))
model.summary()
model.compile(Adam(lr=.0000025), loss='categorical_crossentropy', metrics=['accuracy'])
接下来我训练了模型:
model.fit_generator(train_batches,validation_data=validation_batches,
epochs=85, verbose=1,callbacks=[tbCallBack,earlystopCallback])
最后我像这样保存我的模型:
model.save("model.h5")
现在,当我重新启动内核并使用:
再次加载模型时from keras.models import load_model
new_model = load_model("model.h5")
当模型加载时,我收到警告告诉我:
C:\用户... \ Anaconda2 \ ENVS \ tensorflow-GPU \ lib中\站点包\ keras \ models.py:291: UserWarning:加载保存的优化器状态时出错。结果是, 你的模型是从一个刚刚初始化的优化器开始的 warnings.warn('加载保存的优化器时出错'
此外,当我使用加载的模型进行预测时,我得到错误的值(与我训练的值非常不同),并且看起来模型根本没有经过训练。但是,当我检查.get_weights时,我看到已加载权重。
我还试图通过json和权重来保存和加载模型,如下所示:
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model_weights.h5")
并加载:
#load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
load_model = model_from_json(loaded_model_json)
# load weights into new model
load_model.load_weights("model_weights.h5")
虽然以这种方式加载模型并没有给我一个错误信息,但我的预测仍然比我以前训练过的模型差得多。为了确保模型加载工作,我做了以下工作:
我检查了训练模型和加载模型的权重,它们看起来是一样的。
同时检查模型摘要“model.summary()”显示相同的体系结构。
所以根据我的理解,具有相同的架构和相同的权重应该产生相同的模型,即结果 - 但我无法弄清楚为什么不是这种情况
更让我感到困惑的是,当我使用model.get_weights()和model.set_weights()时,它可以很好地工作,例如:
#getting weights from the old model
weights = model.get_weights()
# setting weights of the new model
new_model.set_weights(weights)