【问题标题】:Proper way to save Transfer Learning model in Keras在 Keras 中保存迁移学习模型的正确方法
【发布时间】:2018-03-02 21:00:08
【问题描述】:

我已经使用 keras 中 ResNet50 的迁移学习训练了一个宪法网络,如下所示。

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() 函数来保存模型。但后来当我加载模型并验证模型时,它的行为就像一个未经训练的模型。我认为重量没有保存。哪里错了。?如何正确保存这个模型?

【问题讨论】:

  • 使用save_model()会发生什么?
  • 它说模型没有那个功能。
  • 你用的是什么版本的keras?
  • Keras 版本为 2.0.6
  • save_model 不是任何模型类的成员函数,它是 keras.models 包中的一个函数。

标签: machine-learning deep-learning keras


【解决方案1】:

根据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')

我正在使用相同的方法,并且效果很好。

【讨论】:

  • 我会尝试使用这种方法。我知道这种方法,但还没有尝试过,因为 save_model() 和 load_model() 到目前为止工作正常。
  • 我想知道使用 save() 函数时到底发生了什么。重量没有保存吗?
  • model.save() 功能与save_model() 完全相同。它只是save_model() 的包装。
  • 我已将模型保存并加载为 json。但我不能继续训练。它仍然表现得像一个未经训练的模型。
  • @SreeramTP 加载json文件后权重加载了吗。
【解决方案2】:

我不知道我的模型会发生什么,但我从来没有使用过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))

为此,只需再次创建模型(保留用于创建模型的代码)并设置其权重。

【讨论】:

  • load_model() 和 save_model() 在使用具有 Sequential、LSTM 等的普通网络时对我来说工作正常。我只在迁移学习中遇到这个问题。
  • 我还尝试保存和加载权重,以保持模型架构相同。然后模型的行为也未经训练。
  • 你在编译之前是否将trainable=False设置为所有base_model层?
  • 那么你的训练就是改变 resnet 模型。一开始它可能会大大降低质量。
  • 那么保存和重用模型的最佳方法是什么?保存到 json.?
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2020-05-13
  • 2021-06-03
  • 2020-02-11
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多