VGG簡單學習
簡單介紹
? 在AlexNet網絡的基礎上,為了設計深層神經網絡,牛津大學設計了VGG網絡,采用塊的設計理念,將AlexNet中多個重復的卷積層和池化層組成一個塊
?論文中,使用3x3卷積核,padding=1的卷積層 和帶有2x2的匯聚窗口,步幅為2 的最大匯聚層
- VGG使用可重復使用的卷積塊來構建深度卷積神經網絡
- 不同的卷積塊個數和超參數可以得到不同復雜度的變種
模型搭建與訓練
?VGG神經網絡連接幾個VGG塊由超參數變量conv_arch定義,該變量指定列每一個VGG塊中卷積層的個數和輸出通道數目,全連接模塊和AlexNet中的相同。
- 定義單個VGG塊 Num_convs定義了層的數量 使用循環進行添加 一個卷積層 之后添加一個激活函數
import torch
from torch import nn
from d2l import torch as d2l
# 參數分別對應:卷積層數量 輸入通道數量 輸出通道數量
def vgg_block(num_convs,in_channels,out_channels):layers = []for _ in range(num_convs):# 添加一個卷積層layers.append(nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=3,padding=1))# 添加激活函數layers.append(nn.ReLU())# 因為添加多個卷積層 上一層的輸出通道 對應下一層的數通道in_channels = out_channels# 添加一個最大池化層layers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)
?原本的VGG網絡由五個卷積塊,其中前兩個快有一個卷積層,后面三個快包含兩個卷積層,第一個模塊有64個輸出通道,每一個后續模塊將輸出通道數量翻倍,直到該數字達到512,由于該網絡使用八個卷積層和三個全連接層,該網絡是用來八個卷積層和三個全連接層,因此稱之為VGG-11
conv_arch = ((1,64),(1,128),(2,256),(2,512),(2,512))
- 定義vgg網絡
def vgg(conv_arch):conv_blks = []in_channels = 1 # 初始化輸入通道數 在一個卷積層添加之后 需要更新輸入通道數# 卷積層部分for(num_convs,out_channels) in conv_arch:# 遍歷元組# 初始化VGG 塊 然后添加進去conv_blks.append(vgg_block(num_convs=num_convs,in_channels=in_channels,out_channels=out_channels))# 更新輸入通道數in_channels = out_channels# 全連接層 經過一系列卷積層之后 需要將4D向量 轉換為2D向量return nn.Sequential(*conv_blks,nn.Flatten(),# 全練級曾部分nn.Linear(out_channels * 7 * 7,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,10))
- 初始化 打印結構
net = vgg(conv_arch=conv_arch)X = torch.randn(size=(1,1,224,224))for blk in net:X = blk(X)print(blk.__class__.__name__,'output shape:\t',X.shape)
Sequential output shape: torch.Size([1, 64, 112, 112])
Sequential output shape: torch.Size([1, 128, 56, 56])
Sequential output shape: torch.Size([1, 256, 28, 28])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 7, 7])
Flatten output shape: torch.Size([1, 25088])
Linear output shape: torch.Size([1, 4096])
ReLU output shape: torch.Size([1, 4096])
Dropout output shape: torch.Size([1, 4096])
Linear output shape: torch.Size([1, 4096])
ReLU output shape: torch.Size([1, 4096])
Dropout output shape: torch.Size([1, 4096])
Linear output shape: torch.Size([1, 10])
- 訓練網絡
lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())