入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
✨完整代码在我的github上,有需要的朋友可以康康✨
https://github.com/tt-s-t/Deep-Learning.git
目录
一、VGG网络的背景
二、VGG网络结构
1、各网络结构参数图示
2、输入
3、双层 —— 一层卷积+(一层卷积+最大池化)
4、三层 —— 两层卷积+(一层卷积+最大池化)
5、全连接层——分类判决
6、拓展:VGG16_bn
三、VGG网络的亮点——连续小卷积核代替大卷积核
四、VGG网络的不足
五、VGG代码实现
AlexNet问世之后,很多学者通过改进AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。
而VGG的作者们则选择了另外一个方向,即加深网络深度。
VGGNet的网络结构简单、规整且高效。VGGNet较为典型的网络结构主要有VGG16和VGG19(两者并没有本质上的区别,只是网络深度不一样)。
接下来以VGG16为例子来进行讲解
(224,224,3)的RGB图像作为输入
这里总共4层。
都是使用卷积核为(3,3)的卷积层,每过一层(不含池化)尺寸不变,每过一层池化尺寸减半。
因此(224,224,3)->(224,224,64)->(112,112,64)->(112,112,128)->(56,56,128)
这里总共9层。
因此(56,56,128)-> (56,56,256)-> (28,28,256)-> (28,28,512)-> (14,14,512)-> (7,7,512)
3层全连接层,将提取到的特征进行相应的整合判断,得出归属每一类的得分值。
就是在提取特征的每一层多加了BatchNorm2d层。
BatchNorm2d层的作用是:进行批量标准化处理(对于所有的batch中样本的同一个channel的数据元素进行标准化处理,即如果有C个通道,无论batch中有多少个样本,都会在通道维度上进行标准化处理,一共进行C次。),这样能把输入的数限制在一个范围内,把数据重新变为正态分布。
公式:
具体结构如下:
采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)
对于给定的感受野,采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层(3个3*3卷积附带3个ReLU,而一个7*7卷积只附带一个ReLU)可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。
在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样可以在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。
✨替代原因✨
如图所示,最上面的那个特征最终是由下面5*5的特征得到的,这样的效果跟一层5*5卷积的效果一样。
参数:3*3*2<5*5
耗费更多计算资源,并且使用了更多的参数(这里不是因为多层3x3卷积),导致更多的内存占用。其中绝大多数的参数都是来自于第一个全连接层。
详见
https://github.com/tt-s-t/Deep-Learning.git
中的VGG文件夹。
这里只展示模型架构
import torch
import torch.nn as nn
class VGG(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3,64,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(64,64,(3,3),padding=1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(64,128,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(128,128,(3,3),padding=1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(128,256,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(256,256,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(256,256,(3,3),padding=1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(256,512,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(512,512,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(512,512,(3,3),padding=1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(512,512,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(512,512,(3,3),padding=1),
nn.ReLU(),
nn.Conv2d(512,512,(3,3),padding=1),
nn.ReLU(),
nn.MaxPool2d(2,2)
)
self.classifier = nn.Sequential(
nn.Linear(25088,4096),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096,4096),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096,1000)
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, start_dim=1)
x = self.classifier(x)
return x
欢迎大家在评论区批评指正,谢谢大家~