初识Cifar10之vgg网络

2022-06-08 13:50:19 浏览数 (1)

上一篇文章我们介绍了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的网络结构图;

max

0 人点赞