我使用来自下文给出的Resras50的转移学习训练了一个宪法网络。
base_model = applications.ResNet50(weights='imagenet', include_top=False, input_shape=(333, 333, 3))
## set model architechture
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(y_train.shape[1], activation='softmax')(x)
model = Model(input=base_model.input, output=predictions)
model.compile(loss='categorical_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
model.summary()
在训练模型后,我想保存模型。
history = model.fit_generator(
train_datagen.flow(x_train, y_train, batch_size=batch_size),
steps_per_epoch=600,
epochs=epochs,
callbacks=callbacks_list
)
我不能使用keras模型中的save_model()函数,因为模型的类型是Model。我使用save()函数来保存模型。但后来当我加载模型并验证模型时,它表现得像一个未经训练的模型。我认为重量没有得到保存。哪里错了。?如何正确保存此模型。?
答案 0 :(得分:7)
根据Keras official docs, 如果您只需要保存模型的架构,则可以使用
model_json = model.to_json()
with open("model_arch.json", "w") as json_file:
json_file.write(model_json)
保存重量
model.save_weights("my_model_weights.h5")
您可以稍后加载json文件并使用
from keras.models import model_from_json
model = model_from_json(json_string)
同样,对于权重,您可以使用
model.load_weights('my_model_weights.h5')
我使用相同的方法,这非常有效。
答案 1 :(得分:1)
我不知道我的模型会发生什么,但我从未能够使用save_model()
和load_model()
,总是会出现错误。但是存在这些功能。
我通常做的是保存和加载权重(它足以使用模型,但可能会导致进一步培训的一点问题,因为"优化器"状态未保存,但它从来都不是一个大问题,很快就会有一个新的优化器找到它的方式)
model.save_weights(fileName)
model.load_weights(fileName)
我们使用numpy进行保存的另一个选择 - 这个从未失败过:
np.save(fileName,model.get_weights())
model.set_weights(np.load(fileName))
为此,只需再次创建模型(保留用于创建模型的代码)并设置其权重。