赞
踩
目录
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倍,参数量大小也是两倍多。
解释:从下往上看,意思就是第一次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卷积核
(11-1)/2=5,故5个3x3的卷积核可以替代原来11x11的卷积核,即n-11+1=n+(-3+1)*5
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。