网络中的亮点:通过堆叠多个3x3的卷积核来代替大尺度卷积核(减少所需参数),可以拥有相同的感受野
1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。
5、conv4三次[3,3]卷积网络,输出的特征层为512,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。
6、conv5三次[3,3]卷积网络,输出的特征层为512,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。
7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。
8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。
最后输出的就是每个类的预测。
在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小。
在VGG中,使用三个3x3的卷积核可以替代一个7x7的卷积核(步长默认为1):
论文中提到通过这种方法能够减少所需参数:
假设输入输出channel为C,那么使用7x7卷积核所需参数为7x7xCxC=49C3;堆叠三个3x3卷积核所需参数为3x3xCxC+3x3xCxC+3x3xCxC=27C3。
VGG网络可以分为两个部分:提取特征网络结构和分类网络结构
#cfgs字典文件,字典的每个key代表每个模型的配置文件
cfgs = {
'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], #列表中的数字代表卷积层卷积核的个数,M代表池化层的结构(maxpool)
'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'],
}
def make_features(cfg: list): #生成提取特征网络(list类型)
layers = [] #定义一个空列表用来盛放定义的每一层结构
in_channels = 3 #输入的图片是RGB图像
for v in cfg: #for循环来遍历配置列表
if v == "M": #如果配置元素是M,那么说明该层为最大池化层,那么就创建一个最大池化下采样层
layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
else: #否则该层为卷积层,则创建卷积操作
conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
layers += [conv2d, nn.ReLU(True)] #将定义的卷积层和ReLU激活函数拼接并添加到layers列表中
in_channels = v #当特征矩阵通过该层卷积后其输出变成v
return nn.Sequential(*layers) #将列表通过非关键字参数的形式传入(*代表通过非关键字形式,sequential要求)
self.classifier = nn.Sequential( #生成分类网络结构
nn.Linear(512*7*7, 4096), #展平处理
nn.ReLU(True),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096),
nn.ReLU(True),
nn.Dropout(p=0.5),
nn.Linear(4096, num_classes)
)
导师博客:https://blog.csdn.net/qq_37541097/article/details/103482003
导师github:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
代码用的导师的,自己又加了些备注,就放在自己的github里了:
https://github.com/Petrichor223/Deep_Learning/tree/master