深度学习之VGG网络搭建
- 1.VGG动机
- 2.VGG架构
- 3.代码
- 4.结论
1.VGG动机
随着卷积网络在计算机视觉领域的快速发展,越来越多的研究人员开始通过改变模型的网络结构在提高在图像识别任务中的精度,例如使用更小的卷积核和步长[2]。基于类似的想法,论文作者提出可以尝试通过改变卷积网络深度来提高模型的分类精度。VGG模型于2014年诞生于Visual Geometry Group 实验室,而这3个单词的首字母也代表了VGG的含义。VGG网络总体上一共有5种网络架构,但是从本质上来说这5种网络架构都是一样的,仅仅只是在卷积的深度上有所差别,因此VGG也可以看作是不同卷积深度对模型效果影响的一次探索。
在论文中,作者对卷积网络卷积深度的设计进行了探索,并且通过尝试逐步加深网络的深度来提高模型的整体性能,这使得VGG在当年的ILSVRC任务中以稳定的优势分别取得了两项比赛的第1名和第2名。
2.VGG架构
VGG可以分为两个部分,第一部分主要是由卷积层和汇聚层构成,第二部分由全连接层构成.
3.代码
import torch
from torch import nn
from d2l import torch as d2limport torch
from torch import nn
from d2l import torch as d2ldef vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels,kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))def vgg(conv_arch):conv_blks = []in_channels = 1# 卷积层部分for (num_convs, out_channels) in conv_arch:conv_blks.append(vgg_block(num_convs, in_channels, out_channels))in_channels = out_channelsreturn 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)X = torch.randn(size=(1, 1, 224, 224))
for blk in net:X = blk(X)print(blk.__class__.__name__,'output shape:\t',X.shape)# 训练模型
ratio = 4
# 卷积架构
small_conv_arch = [(pair[0],pair[1]) for pair in conv_arch]lr,num_epochs,batch_size = 0.05,10,128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size,resize=224)
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())