如何在Python中使用预训练模型同Keras合作?
在深度学习领域,技术日新月异,不断涌现出各种新型的网络结构,在这些模型中,预训练模型一直是备受瞩目的一类。预训练模型指的是在数据集上进行了训练的模型,其通常会包括一个特征提取器和分类器。这些模型可以在各种任务上进行微调,使得模型更好地泛化,并大幅缩小训练时间。而Keras是一个在Python中构建深度学习模型的高层API,可以极大地简化深度学习模型的开发流程。
本文将介绍如何使用Keras同预训练模型合作,主要会涉及以下内容:
- Keras中的预训练模型
- 如何下载和载入预训练模型
- 如何进行微调
更多Python教程,请阅读:Python 教程
Keras中的预训练模型
Keras中内置了许多预训练模型,包括VGG16、InceptionV3、ResNet50等等。这些模型可以在ImageNet数据集上做过预训练,并取得了令人瞩目的高分类精度。在Keras中,这些模型的传统实现方式如下所示:
from keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet', include_top=True)
其中,weights参数指定了预训练模型所在文档的位置,include_top参数指定了是否需要添加分类器。
如何下载和载入预训练模型
如果想要使用预训练模型,需要下载权重文件并载入到模型中。在Keras中,我们可以通过函数下载与载入。以VGG16为例,下载代码如下所示:
from keras.utils.data_utils import get_file
VGG16_WEIGHTS_PATH = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5'
VGG16_WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5'
weights_path = get_file('vgg16_weights_tf_dim_ordering_tf_kernels.h5',
VGG16_WEIGHTS_PATH,
cache_subdir='models',
file_hash='64373286793e3c8b2b4e3219cbf3544b')
对于模型权重文件太大的情况下,使用函数载入模型权重:
model.load_weights(weights_path)
其中,model是VGG16模型的实例对象。
如何进行微调
使用预训练模型时,需要注意的是,由于预训练模型是在指定数据集上进行训练的,所以要确保微调的任务与原来的任务有对应关系。微调时需要保留预训练模型的特征提取器(即卷积层),将分类器改为新任务的分类器,然后在新数据集上进行训练。
微调的Keras实现示例代码如下所示:
from keras.applications.resnet50 import ResNet50
from keras.layers import Input, Dense, GlobalAveragePooling2D
from keras.models import Model
from keras.optimizers import SGD
base_model = ResNet50(weights='imagenet', include_top=False)
# 新的顶部层
x = base_model.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(num_classes, activation='softmax')(x)
# 组装新的完整模型
model = Model(inputs=base_model.inputs, outputs=predictions)
# 锁定卷积层的权重,只训练顶部分类器的权重
for layer in base_model.layers:
layer.trainable = False
# 模型编译
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9),
loss='categorical_crossentropy',
metrics=['acc'])
# 在新数据集上训练
model.fit(X_train, y_train, epochs=10, batch_size=32)
在上述代码中,我们使用ResNet50作为预训练模型,然后将其顶部层修改为一个新的全连接层进行微调。接着锁定卷积层的权重,只训练新的顶部分类器。最后编译模型,将学习率设置为0.0001,动量参数设置为0.9,然后在新数据集上进行训练。
结论
本文介绍了如何在Python中使用预训练模型同Keras合作。我们首先介绍了Keras中内置的预训练模型,然后演示了如何下载和载入预训练模型,最后示范了如何进行微调。使用预训练模型可以大幅缩小训练时间,并使模型更好地泛化,是深度学习模型开发中不可或缺的重要环节。
极客笔记