首页 文章

在Keras中保存传输学习模型的正确方法

提问于
浏览
6

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

2 回答

  • 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')
    

    我使用相同的方法,这非常有效 .

  • 7

    我't know what happens with my models, but I'从未能够使用 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))
    

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

相关问题