VGGNet 论文精度,并解析 VGG-16 网络模型结构

《VERY DEEP CONVOLUTIONAL NETWORKSFOR LARGE-SCALE IMAGE RECOGNITION》

《大规模图像识别的深度卷积网络》

论文地址:https://arxiv.org/abs/1409.1556 

目录

一、引言

二、结论

三、VGGNet 网络模型结构

四、VGG 相对于AlexNet 的改进


一、引言

本文研究了卷积网络深度对其在大规模图像识别数据集中准确率的影响。我们的主要贡献是对使用非常小( 3×3 )卷积滤波器的架构来增加深度的网络进行了深入的评估,这表明通过将深度推到16 - 19个权重层可以显著改善现有的配置。这些发现是我们ImageNet挑战赛2014年提交的基础,我们的团队分别在定位和分类轨道上获得了第一名和第二名。我们还表明,我们的表示很好地推广到其他数据集,它们在那里取得了最新的结果。我们已经公开提供了两个性能最好的ConvNet模型,以便进一步研究在计算机视觉中使用深度视觉表示。

其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。

二、结论

在本工作中,我们评估了用于大规模图像分类的非常深度卷积网络( 最多 19个权重层 )。研究表明,表示深度有利于提高分类精度,并且可以使用深度大大增加的传统ConvNet架构《ImageNet classification with deep convolutional neural net-works》实现ImageNet挑战数据集上的最新性能。在附录中,我们也表明我们的模型能够很好的推广到广泛的任务和数据集,匹配或优于围绕较少深度图像表示构建的较复杂的recognition pipelines。我们的结果再次证实了深度在视觉表征中的重要性。

三、VGGNet 网络模型结构

不同的VGG卷积神经网络的配置如下图所示,

  • LRN:local response normalization,局部响应归一化,利用近邻数据进行归一化。
  • MaxPool:最大值池化,即在池化范围内选取一个最大值像素。
  • FC:全连接层。
  • 每一列都是一个卷积神经网络的配置。
  • 因为增加了一些层(粗体表示增加的层),故配置的深度从左往右逐渐增加。
  • 卷积层(conv layer)的参数被记为:“conv<感受野大小>-<通道数>”。
  • 所有的激活函数都选取ReLU,为了简洁,表格中没有展示ReLU激活函数。
  • 所有的配置都遵循相同的框架(AlexNet:5个卷积层和3个全连接层)。
  • A-E只在深度方向上有差异,从网络A中的11个权重层到E中的19个权重层。
  • 卷积层的深度(通道数)相当小,从第一层的64开始,在每一个最大值池化层后增加2倍,直到达到512层。 

因为A-E中,VGG16的综合效果最好,并且被广泛应用,下面用VGG16的模型结构对VGGNet进行深入剖析。

其中Conv3-64代表:64个3*3,深度为3的卷积核;Conv3-128代表:128个3*3,深度为64的卷积核。值得注意的是,每一层的卷积核的深度可能不一致,取决于上一层的图像的深度。

下图是卷积的工作过程,96个1*1,深度为96的卷积核,把28*28*192的图像卷积成大小为28*28*96的图像(降低维度)。

 四、VGG 相对于AlexNet 的改进

VGG没有在第一层使用相对较大的感受野,而AlexNet在第一层使用11*11的卷积核,步长=4,VGG在整个网络中使用非常小的3*3感受野,这些感受野与每个像素的输入(步长1)相卷积

不难看出,由两个中间没有空间池化的3*3卷积核组成的卷积层,有一个5*5大小的有效感受野;同理可知,三个卷积核组成的卷积层,则有一个7*7的有效感受野。

如下图所示,7*7的图像分别经过3个3*3的卷积核后,其感受野增长到了7*7,即经过三次卷积后的图像中的一个像素,和第一层图像中的7*7个像素有关联。

所以我们用3个3×3的卷积叠层代替单个7×7的卷积叠层得到了什么?

  • (1)首先,我们用三个非线性校正层(ReLus)代替一个非线性校正层(ReLU),使得决策函数更具区分度。
  • (2)其次,我们减少了参数个数:假设三层3 × 3卷积堆的输入和输出都有C通道,堆栈参数为3(3^{2}C^{2})=27C^{2}个权重;同时,单个7 × 7层需要7^{2}C^{2}=49C^{2}个权重,计算量多了81 %以上。
  • (3)最后,多个卷积堆叠在一起可以使得模型的深度增加,证明了本文章的结论:深度在视觉表征中的重要性。

相对于AlexNet,在VGG16-C中使用了1*1的卷积层,1*1的卷积层是一种增加决策函数非线性而又不影响卷积层的感受野的方法。即使在我们的情况下,1 × 1卷积本质上是在同维空间( 输入和输出通道数目相同 )上的线性投影,但由the rectification function引入了额外的非线性项。应该指出的是,《Network in Network》论文使用了1×1的卷积层。

 >>>如有疑问,欢迎评论区一起探讨!

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VGG16深度学习中非常经典的模型之一,其使用了16层卷积神经网络来进行图像分类任务。下面是基于TensorFlow实现VGG16的代码: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense def vgg16(input_shape=(224, 224, 3), num_classes=1000): inputs = Input(shape=input_shape) # Block 1 x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(inputs) x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x) # Block 2 x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x) x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x) # Block 3 x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x) # Block 4 x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x) # Block 5 x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x) # Classification block x = Flatten(name='flatten')(x) x = Dense(4096, activation='relu', name='fc1')(x) x = Dense(4096, activation='relu', name='fc2')(x) outputs = Dense(num_classes, activation='softmax', name='predictions')(x) # Create model model = tf.keras.Model(inputs, outputs) return model ``` 以上代码定义了一个名为`vgg16`的函数,它接受输入的图像大小和输出类别数,并返回一个完整的模型模型的实现与VGG16论文中所描述的架构一致,包括5个卷积块和一个分类块。 你可以通过调用`vgg16()`函数来创建一个新的VGG16模型,如下所示: ```python model = vgg16(input_shape=(224, 224, 3), num_classes=1000) ``` 其中,`input_shape`指定了输入图像的大小,`num_classes`指定了模型输出的类别数。你可以根据自己的需要来调整这些参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying Bulldog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值