python训练模型需要多少个ecopy_python – Keras VGG16我需要预训练重量吗?

您是否应该为特定任务重新训练VGG16?绝对不!重新训练如此庞大的网络很难,并且需要很多直觉和知识来培训深层网络.让我们分析为什么你可以使用在ImageNet上预训练的权重来完成你的任务:

> ImageNet是一个庞大的数据集,包含数百万个图像. VGG16本身已在3-4天左右的强大GPU上接受过培训.在CPU上(假设您没有像NVIDIA GeForce Titan X那样强大的GPU)需要数周时间.

> ImageNet包含来自现实世界场景的图像. NBA比赛也可以被视为现实世界的场景.因此,ImageNet功能的预训练很可能也可用于NBA比赛.

实际上,您不需要使用预先训练过的VGG16的所有卷积层.让我们看看visualization of internal VGG16 layers并看看它们检测到了什么(取自this article;图像太大,所以我只提供了一个紧凑的链接):

>第一个和第二个卷积块查看低级特征,例如角,边等.

>第三和第四个卷积块查看曲面特征,曲线,圆等.

>第五层着眼于高级功能

因此,您可以决定哪种功能对您的特定任务有益.在第5街区你需要高水平的功能吗?或者您可能想要使用第3块的中级功能?也许你想在VGG底层叠加另一个神经网络?有关更多说明,请查看我编写的以下教程;它曾经是SO文档.

使用VGG和Keras进行传输学习和微调

在这个例子中,提出了三个简短而全面的子示例:

>从Keras库附带的可用预训练模型中加载重量

>在VGG的任何层之上堆叠另一个网络进行培训

>在其他图层的中间插入图层

>使用VGG进行微调和转移学习的提示和一般经验法则

加载预先训练的重量

Keras提供包括VGG-16和VGG-19在内的ImageNet模型的预训练.在此示例中,此处和之后将使用VGG-16.欲了解更多信息,请访问Keras Applications documentation.

from keras import applications

# This will load the whole VGG16 network, including the top Dense layers.

# Note: by specifying the shape of top layers, input tensor shape is forced

# to be (224, 224, 3), therefore you can use it only on 224x224 images.

vgg_model = applications.VGG16(weights='imagenet', include_top=True)

# If you are only interested in convolution filters. Note that by not

# specifying the shape of top layers, the input tensor shape is (None, None, 3),

# so you can use them for any size of images.

vgg_model = applications.VGG16(weights='imagenet', include_top=False)

# If you want to specify input tensor

from keras.layers import Input

input_tensor = Input(shape=(160, 160, 3))

vgg_model = applications.VGG16(weights='imagenet',

include_top=False,

input_tensor=input_tensor)

# To see the models' architecture and layer names, run the following

vgg_model.summary()

使用从VGG获取的底层创建新网络

假设对于具有大小(160,160,3)的图像的某些特定任务,您希望使用预先训练的VGG底层,最多使用名称block2_pool的图层.

vgg_model = applications.VGG16(weights='imagenet',

include_top=False,

input_shape=(160, 160, 3))

# Creating dictionary that maps layer names to the layers

layer_dict = dict([(layer.name, layer) for layer in vgg_model.layers])

# Getting output tensor of the last VGG layer that we want to include

x = layer_dict['block2_pool'].output

# Stacking a new simple convolutional network on top of it

x = Conv2D(filters=64, kernel_size=(3, 3), activation='relu')(x)

x = MaxPooling2D(pool_size=(2, 2))(x)

x = Flatten()(x)

x = Dense(256, activation='relu')(x)

x = Dropout(0.5)(x)

x = Dense(10, activation='softmax')(x)

# Creating new model. Please note that this is NOT a Sequential() model.

from keras.models import Model

custom_model = Model(input=vgg_model.input, output=x)

# Make sure that the pre-trained bottom layers are not trainable

for layer in custom_model.layers[:7]:

layer.trainable = False

# Do not forget to compile it

custom_model.compile(loss='categorical_crossentropy',

optimizer='rmsprop',

metrics=['accuracy'])

删除多个图层并在中间插入一个新图层

假设您需要通过将block1_conv1和block2_conv2替换为单个卷积层来加速VGG16,以便保存预先训练的权重.

我们的想法是将整个网络拆分为单独的层,然后再组装.以下是专门针对您的任务的代码:

vgg_model = applications.VGG16(include_top=True, weights='imagenet')

# Disassemble layers

layers = [l for l in vgg_model.layers]

# Defining new convolutional layer.

# Important: the number of filters should be the same!

# Note: the receiptive field of two 3x3 convolutions is 5x5.

new_conv = Conv2D(filters=64,

kernel_size=(5, 5),

name='new_conv',

padding='same')(layers[0].output)

# Now stack everything back

# Note: If you are going to fine tune the model, do not forget to

# mark other layers as un-trainable

x = new_conv

for i in range(3, len(layers)):

layers[i].trainable = False

x = layers[i](x)

# Final touch

result_model = Model(input=layer[0].input, output=x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值