Pytorch经典模型复现系列(二)分类网络:VGGNet
论文:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
复现代码:https://github.com/lvjian0706/CNN-repetition.git
网络简介
VGG的主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。
VGG16的一个主要改进是采用连续的3x3卷积核来代替11x11,7x7,5x5的大尺寸卷积核。对于给定的感受野,采用堆积的小卷积核在性能上是优于采用大卷积核的,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且参数更少。
其中,3个3x3卷积核可以代替7x7卷积核,2个3x3卷积核可以代替5*5卷积核。而在参数量上,3个步长为1的3x3卷积核参数总量为 3x(9xC^2) ,如果直接使用7x7卷积核,其参数总量为 49xC^2 ,这里 C 指的是输入和输出的通道数。很明显,27xC2小于49xC2,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。
网络结构
VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示
VGG19包含了19个隐藏层(16个卷积层和3个全连接层),如上图中的E列所示
VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的max pooling。
Pytorch复现代码
import torch
import torch.nn as nn
class VGG16(nn.Module):
def __init__(self, num_classes):
super(VGG16, self).__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 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