[PyTorch]ZFNet vs AlexNet
ZFNet
对AlexNet
进行了调整,使用更小的滤波器取得更大的特征提取能力。使用PyTorch
进行测试
AlexNet推导
参考:AlexNet
AlexNet
包含5
个卷积层+3
个池化层+3
个全连接层,其结构如下:
输入大小 | 滤波器大小 | 步长 | 零填充 | 滤波器个数 | 输出大小 | |
---|---|---|---|---|---|---|
CONV1 | 227x227x3 | 11x11x3 | 4 | 0 | 96 | 55x55x96 |
POOL2 | 55x55x96 | 3x3 | 2 | / | 96 | 27x27x96 |
CONV3 | 27x27x96 | 5x5x96 | 1 | 2 | 256 | 27x27x256 |
POOL4 | 27x27x256 | 3x3 | 2 | / | 256 | 13x13x256 |
CONV5 | 13x13x256 | 3x3x256 | 1 | 1 | 384 | 13x13x384 |
CONV6 | 13x13x384 | 3x3x384 | 1 | 1 | 384 | 13x13x384 |
CONV7 | 13x13x384 | 3x3x384 | 1 | 1 | 256 | 13x13x256 |
POOL8 | 13x13x256 | 3x3 | 2 | / | 256 | 6x6x256 |
FC9 | 1x1x9216 | 1x1 | / | / | 4096 | 1x1x4096 |
FC10 | 1x1x4096 | 1x1 | / | / | 4096 | 1x1x4096 |
FC11 | 1x1x4096 | 1x1 | / | / | 1000 | 1x1x1000 |
注意:论文中输入为\(224\times 224\),实际操作为\(227\times 227\)
ZFNet推导
ZFNet
对AlexNet
进行了如下调整:
- 第一层的滤波器大小修改为
7x7
- 第一和第二个卷积层的步长修改为
2
Note:第二个卷积层的零填充修改为1
其网络结构如下所示:
输入大小 | 滤波器大小 | 步长 | 零填充 | 滤波器个数 | 输出大小 | |
---|---|---|---|---|---|---|
CONV1 | 227x227x3 | 7x7x3 | 2 | 0 | 96 | 111x111x96 |
POOL2 | 111x111x96 | 3x3 | 2 | / | 96 | 55x55x96 |
CONV3 | 55x55x96 | 5x5x96 | 2 | 1 | 256 | 27x27x256 |
POOL4 | 27x27x256 | 3x3 | 1 | / | 256 | 13x13x256 |
CONV5 | 13x13x256 | 3x3x256 | 1 | 1 | 384 | 13x13x384 |
CONV6 | 13x13x384 | 3x3x384 | 1 | 1 | 384 | 13x13x384 |
CONV7 | 13x13x384 | 3x3x384 | 1 | 1 | 256 | 13x13x256 |
POOL8 | 13x13x256 | 3x3 | 2 | / | 256 | 6x6x256 |
FC9 | 1x1x9216 | 1x1 | / | / | 4096 | 1x1x4096 |
FC10 | 1x1x4096 | 1x1 | / | / | 4096 | 1x1x4096 |
FC11 | 1x1x4096 | 1x1 | / | / | 1000 | 1x1x1000 |
注意:论文中输入为\(224\times 224\),实际操作为\(227\times 227\)
PyTorch实现
PyTorch
提供了AlexNet
实现,并对其进行了部分修改:
- 减少了第一个卷积层滤波器个数(
96->64
)、第二个卷积层滤波器个数(256->192
)和第四个卷积层滤波器个数(384->256
) - 最后一个卷积层和第一个全连接进行了随机失活操作
其实现代码如下:
1 | class AlexNet(nn.Module): |
ZFNet
在PyTorch
提供的AlexNet
代码上进行修改,实现如下:
1 | class ZFNet(nn.Module): |
VOC 2007
使用Pascal VOC 2007
数据集进行分类,其实现参考create_voc_train_val.py
训练参数
- 优化器:
Adam
,学习率为1e-3
- 按步长衰减,每隔
15
轮衰减一次,衰减因子=0.1
,共训练50
轮 - 损失函数:
Log Loss
- 数据:缩放到
227x227
,50%
几率水平翻转,归一化到0.5
均值,0.5
方差
实现代码
1 | # -*- coding: utf-8 -*- |
训练结果
训练集共6301
张,测试集共6307
张,训练及验证结果如下:
1 | $ python classifier.py |
小结
从结果可知,50
轮训练后AlexNet
最好的验证精度是51.93%
,而ZFNet
最好的验证精度是57.57%
。进一步验证了小滤波器能够得到更好的特征提取能力