VGGNet

Concept and Principle

  • AlexNet的设计很随意,如何变大变深无规律性,VGG探讨了如何对CNN进行扩展
  • 如何更深更大?
    • 更多全连接层(太贵)
    • 更多的卷积层
    • 将卷积层组合成块(VGG)
  • VGG块
    • 使用小卷积核深网络比大小卷积核浅网络效果好
    • 3x3卷积层(n层、m通道)
    • 2x2最大池化层
  • VGG架构
    • 多个VGG块后接全连接层
    • 不同次数的重复块得到不同架构(VGG-16、VGG-19等)

Implementation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import torch
from torch import dropout, nn,optim
import d2l
# 返回VGG块

def vgg_block(num_convs,in_channels,out_channels):
layers=[]
for _ in range(num_convs):
layers.append(
nn.Conv2d(in_channels,out_channels,3,padding=1)
)
layers.append(nn.ReLU())
in_channels=out_channels

layers.append(nn.MaxPool2d(kernel_size=2,stride=2))

return nn.Sequential(*layers)

def vgg_architecture(num_blocks,in_channels):
blocks=[]
out_channels=16
blocks.append(vgg_block(1,in_channels,out_channels))
for _ in range(num_blocks-1):
in_channels=out_channels
out_channels*=2
blocks.append(vgg_block(1,in_channels,out_channels))

return nn.Sequential(*blocks)

def vgg_5(in_channels):
return nn.Sequential(
vgg_architecture(5,in_channels),
nn.Flatten(),
nn.Linear(256*7*7,1024),
nn.Dropout(),
nn.Linear(1024,512),
nn.Dropout(),
nn.Linear(512,10)
)

vgg=vgg_5(1).to(torch.device("cuda:0"))

train_iter,test_iter=d2l.load_data_fashion_mnist(64,224)
loss_f=nn.CrossEntropyLoss()
opt=optim.Adam(vgg.parameters())

d2l.train(10,loss_f,opt,vgg,train_iter,save_name="vgg_5")