本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Bachbone 之 VGGNet:走向深度
2014年的VGGNet荣获ImageNet亚军,其主张探索网络深度与性能的关系,用更小的卷积核与更深的网络结构,并且还取得了较为优异的效果,其网络结果图如示:
从图中可以看出来,网络大概有6种版本,最为常用的是VGG16的版本。VGGNet采用了5组卷积和3个全连接层,最后的部分采用Softmax做分类,其有一个显著的特点就是:
- 每经过一层池化层,特征图的尺寸减小一倍,通道数增加一倍
- 更多地使用3x3的卷积核来代替5*5的卷积核,因为两个3x3的卷积核起到的效果和一个5x5卷积核起到的效果是一样的,同时在同等参数的情况下,3x3的卷积核所用的参数更少;更优秀的是两个3x3卷积核的非线性能力要比5x5卷积核更强,因为其拥有的两个激活函数,可以大大提高卷积网络的学习能力。
详细代码:
from torch import nn
class VGG(nn.Module):
def __init__(self, num_classes=1000):
super(VGG, self).__init__()
layers = []
in_dim = 3
out_dim = 64
##构造13个卷积层
for i in range(13):
layers += [nn.Conv2d(in_dim, out_dim, 3, 1, 1), nn.ReLU(inplace=True)] ##输入通道为3,输出通道为64
##卷积核大小为3x3,步长为1,pading为1,此处如果想要输入与输出是一致的H和W,padding=(kernel_size-1)/2
in_dim = out_dim
###在2,4,7,10,13个卷积层后增加池化层
if i==1 or i==3 or i==6 or i==9 or i==12:
layers += [nn.MaxPool2d(2, 2)]
###第10层卷积后保持和前面的通道数一致,都为512,其余则加倍
if i!=9:
out_dim*=2
self.features = nn.Sequential(*layers)
###定义的3个全连接层,中间有ReLU激活函数和Dropout
self.classifier = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096),
nn.ReLU(True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(True),
nn.Dropout(),
nn.Linear(4096, num_classes),
)
###定义前向传播
def forward(self, x):
x = self.features(x)
###
##这一步作用:将特征图的维度从[1,512,7,7]变为[1,512*7*7],以便于后面的全连接分类
###
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
\