上一篇文章我们介绍了cifar10数据集
初识Cifar10
vgg是由牛津大学cv组和谷歌deepmind一起研究出来的深度卷积神经网络,我们通常说的vgg模型是指vgg-16(13层卷积层 3层全连接层)
代码语言:javascript复制import torch
import torch.nn as nn
import torch.nn.functional as F
class VGGbase(nn.Module):
def __init__(self):
super(VGGbase,self).__init__()
# 3*28*28(crop-->32,28)
self.conv1=nn.Sequential(
nn.Conv2d(3,64,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(64),
nn.ReLU()
)
self.max_pooling1=nn.MaxPool2d(kernel_size=2, stride=2)
# 14*14
self.conv2_1 = nn.Sequential(
nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(128),
nn.ReLU()
)
self.conv2_2 = nn.Sequential(
nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(128),
nn.ReLU()
)
self.max_pooling2 = nn.MaxPool2d(kernel_size=2, stride=2)
# 7*7
self.conv3_1 = nn.Sequential(
nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(256),
nn.ReLU()
)
self.conv3_2 = nn.Sequential(
nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(256),
nn.ReLU()
)
self.max_pooling3 = nn.MaxPool2d(kernel_size=2, stride=2, padding=1)
# 4*4
self.conv4_1 = nn.Sequential(
nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(512),
nn.ReLU()
)
self.conv4_2 = nn.Sequential(
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(512),
nn.ReLU()
)
self.max_pooling4 = nn.MaxPool2d(kernel_size=2, stride=2)
# batchsize *512*2*2 -->batchsize*512*4
self.fc=nn.Linear(512*4, 10)
def forward(self, x):
batchsize = x.size(0)
out = self.conv1(x)
out = self.max_pooling1(out)
out = self.conv2_1(out)
out = self.conv2_2(out)
out = self.max_pooling2(out)
out = self.conv3_1(out)
out = self.conv3_2(out)
out = self.max_pooling3(out)
out = self.conv4_1(out)
out = self.conv4_2(out)
out = self.max_pooling4(out)
out = out.view(batchsize, -1)
# batchsize*c*h*w --> batchsize*n
out = self.fc(out)
out = F.log_softmax(out, dim=1)
return out
def VGGNet():
return VGGbase()
vgg的大致模型如下图
特点:
结构简洁。VGG由5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling分开,所有隐层的激活单元都采用ReLU作为激活函数。
小卷积核和多卷积子层。VGG使用多个较小卷积核(3x3)的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。VGG通过降低卷积核的大小(3x3),增加卷积子层数来达到同样的性能。
小池化核。相比AlexNet的3x3的池化核,VGG全部采用2x2的池化核。
通道数多。VGG网络第一层的通道数为64,后面每层都进行了翻倍,最多到512个通道,通道数的增加,使得更多的信息可以被提取出来。
层数更深、特征图更宽。使用连续的小卷积核代替大的卷积核,网络的深度更深,并且对边缘进行填充,卷积的过程并不会降低图像尺寸。
全连接转卷积(测试阶段)。在网络测试阶段将训练阶段的三个全连接替换为三个卷积,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高维度的输入。
可以看到代码中我们有4层卷积层,4层池化层组成。
vgg16的网络结构图;