【发布时间】:2018-02-16 10:30:04
【问题描述】:
预训练的深度学习模型有两种相关的权重,top(表示密集的全连接层)和 without_top(删除密集的全连接层)。我想知道如何为 no_top 权重训练模型
例如:我有一个架构,我想为它创建在 cifar10 数据上训练的权重。那么如何训练呢?
【问题讨论】:
标签: deep-learning keras conv-neural-network
预训练的深度学习模型有两种相关的权重,top(表示密集的全连接层)和 without_top(删除密集的全连接层)。我想知道如何为 no_top 权重训练模型
例如:我有一个架构,我想为它创建在 cifar10 数据上训练的权重。那么如何训练呢?
【问题讨论】:
标签: deep-learning keras conv-neural-network
既然你说的是CIFAR10,那我给你举个图像分类的例子。
首先,您从 Keras 获得预训练模型,但没有顶层。
from keras.applications.vgg16 import VGG16
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(48, 48, 3))
然后为分类任务添加新层。
x = base_model.output
x = Flatten()(x)
x = Dense(512, activation='elu', kernel_initializer='he_normal')(x)
prediction = Dense(10, activation='softmax', kernel_initializer='he_normal')(x)
最后一层有 10 个单元,因为 CIFAR10 有 10 个类。
你创建你的模型。
model = Model(inputs=base_model.input, outputs=prediction)
您将获得 CIFAR10 数据。
from keras.datasets import cifar10
(Xtrain, Ytrain), (Xtest, Ytest) = cifar10.load_data()
Ytrain = to_categorical(Ytrain)
Ytest = to_categorical(Ytest)
编译和训练。
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(Xtrain, Ytrain, batch_size=64, epochs=1, validation_data=(Xtest, Ytest))
注意:这里的训练会改变你所有层的权重(预训练层 + 新层)。您可能希望在训练之前冻结预训练层,以保持它们经过良好训练的权重。
【讨论】: