[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%。进一步验证了小滤波器能够得到更好的特征提取能力