目录

总体架构图: 

实际代码中问题:

重要的点

Thinking1:使用3x3卷积核替代7x7卷积核的好处?

Thinking2:多少个3x3的卷积核可以替代原来11x11的卷积核?

Thinking3:VGG的C网络结构使用了1x1卷积核,1x1卷积核的主要好处?


主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。

 卷积神经网络当时最出名的一个物体识别网络之一叫做VGG19,每一层神经网络都会利用上一层的输出来进一步提取更加复杂的特征,直到复杂到能被用来识别物体为止,所以每一层都可以被看做很多个局部特征的提取器。VGG19在物体识别方面的精度甩了之前的算法一大截,之后的物体识别系统也基本都改用深度学习了。

总体架构图: 

 

VGG19,总共19层,包括16层卷积层和最后的3层全连接层。中间和往常差不多,用的是池化层,最后经过softmax。

其中激活层并不算入VGG19层中层

实际代码中问题:


import torch
from torchvision import models

class LTE(torch.nn.Module):
    """Learnable Texture Extractor(可学习的纹理提取器)"""
    def __init__(self, requires_grad=True, rgb_range=1):
        super(LTE, self).__init__()

        ### use vgg19 weights to initialize
        vgg_pretrained_features = models.vgg19(pretrained=True).features

        self.slice1 = torch.nn.Sequential()
        self.slice2 = torch.nn.Sequential()
        self.slice3 = torch.nn.Sequential()

        for x in range(2):     # 0,1         ==> 2conv
            self.slice1.add_module(str(x), vgg_pretrained_features[x])
        for x in range(2, 7):  # 2,3,4,5,6   ==> 2conv
            self.slice2.add_module(str(x), vgg_pretrained_features[x])
        for x in range(7, 12): # 7,8,9,10,11 ==> 2conv
            self.slice3.add_module(str(x), vgg_pretrained_features[x])

        print(self.slice1)
        print(self.slice2)
        print(self.slice3)

lte=LTE()

Sequential(
  (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): ReLU(inplace=True)
)
Sequential(
  (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (3): ReLU(inplace=True)
  (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (6): ReLU(inplace=True)
)
Sequential(
  (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (8): ReLU(inplace=True)
  (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (11): ReLU(inplace=True)
)

它这里叫做VGG19,并不是说它的 卷积层+激活层+池化层+全连接层 总共的个数是19,而是说的是16层卷积层和最后的3层全连接层,而没有包含激活层+池化层在内,

由这里实际的代码得知,这里的网络结构和上图的VGG19的网络结构是相同的,只是没有标注出激活层(ReLU),代码中的前面的序号(0),(1),(2)....并不是一一对应上面的图,而是在每个conv后加了一个ReLU,

例如这里的(5)是Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),而图中的第5层是conv3-256(对应代码的(10)),其实并没有任何的问题,只是代码这里在每一个conv后面添加了一个ReLU


这篇文章写的很好:深入解读VGG网络结构(附代码实现)_雷恩Layne-CSDN博客_vgg网络结构

重要的点

其中重要的点写在下面:

1.VGG 最大的特点就是通过比较彻底地采用 3x3 尺寸的卷积核来堆叠神经网络,这样也加深整个神经网络的深度。这两个重要的改变对于人们重新定义卷积神经网络模型架构也有不小的帮助,至少证明使用更小的卷积核并且增加卷积神经网络的深度,可以更有效地提升模型的性能。

2.结构介绍:

(1)INPUT层:VGG16卷积神经网络默认的输入数据必须是维度为224×224×3的图像,和 AlexNet一样,其输入图像的高度和宽度均为224,而且拥有的色彩通道是R、G、B这三个。
(2)CONV3-64:使用的卷积核为(3*3*3)*64(卷积核大小为3*3输入通道为3,输出通道为64),步长为1,Padding为1。通过套用卷积通用公式,可以得到最后输出的特征图的高度和宽度均为224,最后输出的特征图的维度为224×224×64。

3.VGG16相比AlexNet的一个改进是采用连续的3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5),VGG16 全部采用3*3卷积核,步长统一为1,Padding统一为1,和2*2最大池化核,步长为2,Padding统一为0

4.加深结构都使用ReLU激活函数:提升非线性变化的能力

5.VGG19比VGG16的区别在于多了3个卷积层,其它完全一样

6.VGG16基本是AlexNet(AlexNet是8层,包括5个卷积层和3个全连接层)的加强版,深度上是其2倍,参数量大小也是两倍多。


Thinking1:使用3x3卷积核替代7x7卷积核的好处?

  • 2 个 3x3 的卷积核叠加,它们的感受野等同于 1 个 5x5 的卷积核,3 个叠加后,它们的感受野等同于 1 个 7x7 的效果。用2个3x3的卷积核代替原来的 5x5卷积核如下图所示:

解释:从下往上看,意思就是第一次5*5的feature map经过一个3*3的卷积核后,就变成了3*3的feature map,然后3*3的feature map,再经过一个3*3的卷积核,得到的就是一个1*1的feature map,总共经历了两次3*3的卷积核,就由5*5的feature map==》1*1的feature map。那么假如此时直接在5*5的feature map上使用一个5*5的卷积核,那么就会一次得到1*1的feature map。所以这里说使用3x3卷积核可以替代7x7卷积核

  • 由于感受野相同,3个3x3的卷积,使用了3个非线性激活函数,增加了非线性表达能力,从而可以提供更复杂的模式学习。
  • 使用3x3卷积核可以减少参数,假设现在有 3 层 3x3 卷积核堆叠的卷积层,输出和输出通道数都是C,那么它的参数总数是 3x(3x3xCxC)=27xCxC 。同样和它感受野大小一样的一个卷积层,卷积核是 7x7 的尺寸,假如输出和输出通道数都是C,那么它的参数总数就是 7x7xCxC=49xCxC。而且通过上述方法网络层数还加深了。三层3x3的卷积核堆叠参数量比一层7x7的卷积核参数链还要少。
  • 总的来说,使用3x3卷积核堆叠的形式,既增加了网络层数又减少了参数量
     

Thinking2:多少个3x3的卷积核可以替代原来11x11的卷积核?

(11-1)/2=5,故5个3x3的卷积核可以替代原来11x11的卷积核,即n-11+1=n+(-3+1)*5

Thinking3:VGG的C网络结构使用了1x1卷积核,1x1卷积核的主要好处?

  • 使用多个1x1卷积核,在保持feature map 尺寸不变(即不损失分辨率)的前提下,可以大幅增加非线性表达能力,把网络做得很deep。
  • 进行卷积核通道数的降维和升维。
  • 1x1卷积相当于线性变换,非线性激活函数起到非线性作用。
  • 总结就是:1x1 卷积核的好处是不改变感受野的情况下,进行升维和降维,同时也加深了网络的深度

更多推荐

VGG19续读【精细】,为什么叫做VGG19?==>【每一层可以看做是很多个局部特征的提取器,可以用作局部特征提取】