卷积神经网络模型之——VGG-16网络结构与代码实现
文章目錄
- VGGNet簡介
- VGG16網絡結構
- 使用pytorch搭建VGG16
- features
- classifier
- 完整代碼
VGGNet簡介
VGG原文:Very deep convolutional networks for large-scale image recognition:https://arxiv.org/pdf/1409.1556.pdf
VGG在2014年由牛津大學Visual GeometryGroup提出,獲得該年lmageNet競賽中Localization Task(定位任務)第一名和 Classification Task (分類任務)第二名。
VGG與AlexNet相比,它采用幾個連續的3x3的卷積核代替AlexNet中的較大卷積核。
在VGG中,使用了3個3x3卷積核來代替7x7卷積核,使用了2個3x3卷積核來代替5*5卷積核,從而在保證具有相同感知野的條件下,提升了網絡的深度,在一定程度上提升了神經網絡的效果。
在論文中,作者嘗試了使用5種不同的網絡結構,深度分別為11,11,13,16,19,5種結構圖如下所示:
其中最常用的是VGG16和VGG19,下面我們就以VGG16為例來分析它的網絡結構。
VGG16網絡結構
VGG16中的16指的是它由16層組成(13個卷積層 + 3個全連接層,不包括池化層)。
VGG的輸入圖像大小為224X224X3的三通道彩色圖像,共有1000個類別。
其中卷積層的卷積核大小都為3,padding為1;池化層的kernel_size為2,stride為2。
因此
- 卷積層只改變特征圖的通道數,不改變大小。(W - 3 + 2*1)/ 1 + 1 = W
- 池化層不改變特征圖的通道數,大小變為原來的一半。
VGG具有明顯的塊結構,VGG可以分為如下六塊:
使用pytorch搭建VGG16
為了便于理解,我們把正向傳播過程分為兩塊,
- 一塊為特征提取層(features),包括13個卷積層;
- 另一塊為分類層(classify),包括3個全連接層。
features
def make_features(self):cfgs = [64, 64, 'MaxPool', 128, 128, 'MaxPool', 256, 256, 256, 'MaxPool', 512, 512, 512, 'MaxPool', 512, 512, 512, 'MaxPool']layers = []in_channel = 3for cfg in cfgs:if cfg == "MaxPool": # 池化層layers += [nn.MaxPool2d(kernel_size=2,stride=2)]else:layers += [nn.Conv2d(in_channels=in_channel,out_channels=cfg,kernel_size=3,padding=1)]layers += [nn.ReLU(True)]in_channel = cfgreturn nn.Sequential(*layers)classifier
【注意】:在進行全連接之前,需要現將卷積層輸出的三維特征圖展平為1維。
x = torch.flatten(x,start_dim=1)
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, 1000) )完整代碼
""" #-*-coding:utf-8-*- # @author: wangyu a beginner programmer, striving to be the strongest. # @date: 2022/7/1 15:01 """ import torch import torch.nn as nnclass VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.features = self.make_features()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, 1000))def forward(self,x):x = self.features(x)x = torch.flatten(x,start_dim=1)x = self.classifier(x)return xdef make_features(self):cfgs = [64, 64, 'MaxPool', 128, 128, 'MaxPool', 256, 256, 256, 'MaxPool', 512, 512, 512, 'MaxPool', 512, 512, 512, 'MaxPool']layers = []in_channel = 3for cfg in cfgs:if cfg == "MaxPool": # 池化層layers += [nn.MaxPool2d(kernel_size=2,stride=2)]else:layers += [nn.Conv2d(in_channels=in_channel,out_channels=cfg,kernel_size=3,padding=1)]layers += [nn.ReLU(True)]in_channel = cfgreturn nn.Sequential(*layers)net = VGG() print(net)總結
以上是生活随笔為你收集整理的卷积神经网络模型之——VGG-16网络结构与代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒙特卡洛—赌博模型笔记
- 下一篇: 常见密码学算法