目录
本文为学习记录和备忘录,对代码进行了详细注释,以供学习。
内容来源:
★github: https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
★b站:https://space.bilibili.com/18161609/channel/index
★CSDN:https://blog.csdn.net/qq_37541097
1. VGG网络详解
1.1 VGG网络概述
VGG网络在2014年由牛津大学著名研究组VGG(Visual Geometry Group)提出。
论文全称:Very Deep Convolutional Networks For Large-scale Image Recognition.
论文链接:Very Deep Convolutional Networks for Large-Scale Image Recognition
论文的亮点是:通过堆叠多个3×3的卷积核来替代大尺度卷积核,即减少所需参数。具体来讲,可以通过堆叠2个3×3的卷积核替代5×5的卷积核,堆叠3个3×3的卷积核替代7×7的卷积核,两者之间拥有相同的感受野。
VGG网络是一个Deep CNN,具备CNN所有的功能,常用来提取特征图像。在Localization和Classification tasks都取得了很大的成就。
1.2 感受野
(1)感受野的含义
在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小。
(2)感受野的计算
计算公式:
F(i) = [F(i+1)-1]×Stride + Ksize
其中F(i)为第i层感受野,Stride为第i层的步距,Ksize为卷积核或池化核尺寸(默认Stride=1)。
下面举一个例子说明:
Feature map: F = 1;
Pool1: F = (1 - 1) x 2 + 2 = 2;
Conv1: F = (2 - 1) x 2 + 3 = 5;
即第3层1*1区域对应第2层上感受野为2x2,对应第1层上的感受野为5x5。
(3)总结
上面提到,VGG网络中,通过堆叠2个3x3的卷积核替代5x5的卷积核,堆叠3个3x3的卷积核替代7x7的卷积核。依据如下:
感受野计算公式F(i)=[F(i+1)-1]×Stride + Ksize,其中步长Stride=1,卷积核大小Ksize=3,则:
Feature map: F = 1
Conv3x3(3): F = (1 - 1) x 1 + 3 = 3
Conv3x3(2): F = (3 - 1) x 1 + 3 = 5
Conv3x3(1): F = (5 - 1) x 1 + 3 = 7
这样做的目的是减少所需参数,依据如下(假设输入输出channel为C):使用77的卷积核所需参数为7x7xCxC = 49C²,使用3个33卷积核3x(3x3xCxC) = 27C²。(此处第一个C表示输入特征矩阵深度,第二个C表示卷积核个数即输出矩阵深度)
1.3 VGG网络结构和详细参数
作者在文中给出了6个版本:
最常用的是版本D,即VGG16(16指卷积层和全连接层共16层),其网络结构如下图所示:
- 对于Conv3:kernel_size=3;stride=1;padding=1
- 对于maxpool:size=2;stride=2
O U T s i z e = ( I N s i z e − F s i z e + 2 P ) / S + 1. OUTsize= (INsize-Fsize+2P)/S+1. OUTsize=(INsize−Fsize+2P)/S+1.
2. Pytorch搭建
对于代码的解释都在注释中,方便对照查看学习。
2.1 model.py
可将VGG网络分为 提取特征网络结构(FC层之前) 和 分类网络结构(3个FC层)两个部分。
导入模块:
import torch.nn as nn
import torch
首先定义模型配置文件,在这里只搭建A、B、D、E四个版本的VGG网络模型。定义一个配置模型文件:cfgs字典。其中key代表模型,value代表具体配置,value中数字64表示卷积层中3×3卷积核的个数为64,M表示Maxpool,每一项表示一层操作。
cfgs = {
'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}
有了配置文件,下一步则需要构建提取特征网络结构,定义函数make_feature,其传入的变量为配置文件的列表。
def make_features(cfg: