【深度学习基础】PyTorch实现VGG亲身实践
1. 论文关键信息
VGG的思路就是利用多个小尺寸的卷积核串联代替之前网络的大尺寸卷积核,在保持感受野不下降的前提下,减少网络的参数。虽然VGG提出较早,但它仍用在计算机视觉的各个领域内,常被作为骨架网络的一部分;VGG的利用小尺寸卷积核的思路也是后续很多优秀网络结构的原始启发。
闲话少叙,论文中,VGG复现的关键信息是下面这张表:
2. PyTorch实现
2.1 添加头文件
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary
2.2 实现VGG构造类
- 通过上表,我们可以看到,论文提出的几种不同深度的网络从大的结构上讲都分为五组,每组之内的卷积层参数都是一样的,我们可以构造一个通用的类,减少很多重复代码。
- 原文中VGG都还不包括BN层,我的复现引入了BN层。
- 关于BN层是放在ReLU层前面还是后面,有不同的说法。BN在提出的论文中是放在ReLU前面的,但是有说法称使用ReLU作为激活单元的时候,将BN层放在其后面的实践效果更好。由于我没有在数据集上验证,所以采用官方的做法,放在卷积层之后,ReLU之前。实践中可以根据训练效果自行调整。
class VGG(nn.Module):
"""
VGG builder
"""
def __init__(self, arch: object, num_classes=1000) -> object:
super(VGG, self).__init__()
self.in_channels = 3
self.conv3_64 = self.__make_layer(64, arch[0])
self.conv3_128 = self.__make_layer(128, arch[1])
self.conv3_256 =