(新手入门,如理解有误感谢指正)
论文地址
ZFNet通常被认为是ILSVRC 2013的冠军,它实际上是对AlexNet的微调,对AlexNet的网络结构进行了细微调整。
但是这篇论文另一个重要的贡献是提出了对卷积神经网络中间层可视化的方法。
这里我们仅仅只看一些ZFNet网络是什么样的
我们看一下ZFNet的网络结构
我们再放一张AlexNet的网络结构做对比
具体AlexNet的网络讲解可以看我的这篇博客学习AlexNet(网络讲解+代码)
下面是两个网络的结构对比
ZFNet | ZFNet output | AlexNet | AlexNet output | |
---|---|---|---|---|
(layer1) 卷积层 | 7 × 7 7\times7 7×7卷积核(96个),Stride=2,padding=0 | 110 × 110 110\times110 110×110 | 11 × 11 11\times11 11×11卷积核(96个),Stride=4,padding=0 | 55 × 55 55\times55 55×55 |
(layer1) 激活 | ReLU | ReLU | ||
(layer1) 池化层 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 55 × 55 55\times55 55×55 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 27 × 27 27\times27 27×27 |
(layer1) 归一化 | contrast norm | LRN | ||
(layer2) 卷积层 | 5 × 5 5\times5 5×5卷积核(256个),Stride=2,padding=0 | 26 × 26 26\times26 26×26 | 5 × 5 5\times5 5×5卷积核(256个),Stride=1,padding=2 | 27 × 27 27\times27 27×27 |
(layer2) 激活 | ReLU | ReLU | ||
(layer2) 池化层 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 13 × 13 13\times13 13×13 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 13 × 13 13\times13 13×13 |
(layer2) 归一化 | contrast norm | LRN | ||
(layer3) 卷积层 | 3 × 3 3\times3 3×3卷积核(384个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 | 3 × 3 3\times3 3×3卷积核(384个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 |
(layer3) 激活 | ReLU | ReLU | ||
(layer4) 卷积层 | 3 × 3 3\times3 3×3卷积核(384个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 | 3 × 3 3\times3 3×3卷积核(384个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 |
(layer4) 激活 | ReLU | ReLU | ||
(layer5) 卷积层 | 3 × 3 3\times3 3×3卷积核(256个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 | 3 × 3 3\times3 3×3卷积核(256个),Stride=1,padding=1 | 13 × 13 13\times13 13×13 |
(layer5) 激活 | ReLU | ReLU | ||
(layer5) 池化层 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 6 × 6 6\times6 6×6 | 3 × 3 3\times3 3×3池化核,stride=2,padding=0 | 6 × 6 6\times6 6×6 |
(layer6) 全连接层 | 4096 | 4096 | ||
(layer7) 全连接层 | 4096 | 4096 | ||
(layer8) 全连接层 | class num | class num |
此外,ZFNet再一张GPU上训练,AlexNet再两张GPU上训练。
ZFNet Pytorch Code:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class ZFNet(nn.Module):
def __init__(self):
super(ZFNet, self).__init__()
self.conv = nn.Sequential(
# 第一层
nn.Conv2d(1, 96, 7, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 第二次
nn.Conv2d(96, 256, 5, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 第三层
nn.Conv2d(256, 384, 3, 1, 1),
nn.ReLU(),
# 第四层
nn.Conv2d(384, 384, 3, 1, 1),
nn.ReLU(),
# 第五层
nn.Conv2d(384, 256, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(3, 2),
)
# 全连接层
self.fc = nn.Sequential(
nn.Linear(256*5*5, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(0.5),
# 输出层。由于这里使用Fashion-MNIST,所以用类别数为10
nn.Linear(4096, 10),
)
def forward(self, img):
feature = self.conv(img)
# print(feature.shape)
output = self.fc(feature.view(img.shape[0], -1))
return output