VGG网络的实现与探索卷积层参数量,计算量的计算方法

发布于:2024-11-28 ⋅ 阅读:(205) ⋅ 点赞:(0)

1 问题

问题1:了解VGG网络并利用PyTorch实现VGG网络.

问题2:探索卷积层参数量,计算量的计算方法

2 方法

问题1:了解VGG网络并利用PyTorch实现VGG网络

1.了解VGG网络

VGG是Oxford的Visual Geometry Group的组提出的,VGG的缩写也来自于这个组的名字。VGG网络探索了提升网络的深度对最终的图像识别准确率的重要性,同时在VGG中尝试使用小的卷积核来构建深层的卷积网络。VGG在当年的ILSVRC 2014上取得了第一的成绩,证明了增加网络的深度能够在一定程度上提高网络的性能。

2.利用Pytorch实现VGG网络

class VGG16(nn.Module):
    def __init__(self):
        super(VGG16, self).__init()
        self.features = nn.Sequential(
            nn.Conv2d(1, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(128, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(256, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.classifier = nn.Sequential(
            nn.Linear(512, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 10)  # 输出层,共10个类别
        )
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

问题2探索卷积层参数量,计算量的计算方法

1.卷积层参数量的计算方法

卷积层需要关注的参数conv(kernel_size,in_channel,out_channel),即卷积核大小,输出通道数,和偏差bias.

计算公式:conv_param=(k_size*k_size*in_channel+bias)*out_channe

卷积层卷积核大小的计算:一个卷积层的卷积核参数量计算其实就受输入通道、输出通道、卷积核大小的影响,而实际卷积过程中我们还会给每个卷积核都加个偏置。

卷积核参数量= kernel.shape × kernel.num + bias.num

= ( channel(input) × kernel_width × kernel_height ) × channel(output) + channel(output)

2.卷积层计算量的计算方法

若卷积层的输入featuremap的维度为Cin×Hin×Win,卷积核的大小为K1×K2, padding=P1×P2, stride=S1×S2,卷积核(filter)的数量为Cout,则输出特征图的大小为Cout×Hout×Wout。浮点运算量(FLOPs)作为计算量的指标,FLOPs原本指乘法和加法的计算次数总和,即单次乘法和单次加法各算一次浮点运算。如:(a*b+c)浮点运算量是2,(a*b+c*d)的浮点运算量是3。涉及到了乘法运算和加法运算。

乘法运算量 = Cout×Hout×Wout×(Cin×K1×K2)。bias=True,则加法运算次数为Cout×Hout×Wout×1;bias=False,则加法运算次数为0。

bias为True时,总的FLOPS为:Cout×Hout×Wout×(Cin×K1×K2+1)

bias为False时,总的FLOPS为:Cout×Hout×Wout×(Cin×K1×K2)

3 结语

通过本次学习VGG网络,我们明白了VGG网络的基本知识,了解到如果需要构建VGG网络,我们就需要对维度先进行定义,其中主要的部分就是提取特征网络结构与分类网络结构,之后我们要对权重参数进行构造,对于VGG网络的优点是它拥有小卷积核以及它采用连续的几个3x3的卷积核,带来了精度的提升。对于卷积层参数量,计算量的计算方法,我们通过CSDN了解到了它的基础定义与计算方法。