1

我是深度学习和 Keras 的新手。当用于在 Keras 中定义模型时,预训练权重初始化 weights='imagenet' 是什么意思?

ResNet50(weights='imagenet')

谢谢!

4

2 回答 2

4

此代码行创建了一个名称已知的网络架构(您可以在此处ResNet50找到有关它的更多信息)。这使得加载该网络的权重,该网络已在数据集上进行过训练。如果没有这些信息,将只能准备网络架构,但无法将任何权重设置为“好”值,因为它不知道模型的目的。这是通过指定数据集来确定的。weights='imagenet'KerasimagenetKeras

如果您使用的是其他数据集,那么您正在使用该模型作为预训练模型。您可以在此处找到有关此技术的更多信息;但总体思路是:在对任何复杂(图像)数据集进行训练后,模型将在其最低层(大部分时间:卷积)中学习以检测非常基本的特征,例如边缘、角落等. 这有助于模型更快地学习分析自己的数据集,因为它不必再次学习检测这些基本特征。

于 2017-09-04T09:51:40.233 回答
3

按照@FlashTek 的回答,我们还可以在我们的数据集上训练这个模型。

看下面的代码:

model = applications.ResNet50(weights = "imagenet", include_top=False, 
input_shape = (img_width, img_height,3))


# Freeze the layers which you don't want to train. Here I am freezing the first 30 layers.
for layer in model.layers[0:30]:
    layer.trainable = False

for layer in model.layers[30:]:
    layer.trainable = True

#Adding custom Layers 
x = Flatten()(model.output)
# x = Dense(1024, activation="relu")(x)
# x = Dropout(0.5)(x)
# x = Dense(1024, activation="relu")(x)
# x = Dropout(0.5)(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(2, activation="softmax")(x)

在上面的代码中,我们可以指定我们必须在数据集上训练多少层 resnet,方法是将layer.trainable分配为 true 以在您的数据集上进行训练,否则为 false 。

除此之外,我们还可以在网络之后粘贴层,如添加自定义层所示

于 2017-09-04T10:01:23.150 回答