1. SqueezeNet
Iandola, Forrest N., et al. “SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size.” arXiv preprint arXiv:1602.07360 (2016).
本文提出了一种轻量化的图像分类网络:SqueezeNet,正如文章的标题所写,参数量比AlexNet少50倍。可以被部署于嵌入式设备,在分布式训练时减少通信开销。
文章的思想来源于三个设计网络结构的策略:
- Replace 3x3 filters with 1x1 filters (尽量用1x1卷积替换3x3卷积)
- Decrease the number of input channels to 3x3 filters (3x3卷积的输入通道数尽可能减少)
- Downsample late in the network so that convolution layers have large activation
maps (下采样放到网络后面做,这样可以使得网络中间特征图的尺寸足够大,这有利于提高模型精度)
其中策略1,2可以降低参数量,策略3是用于保证模型的精确度。

基于这三个策略,作者设计了如上图所示的网络模块,称为Fire Module。输入先经过squeeze层的1x1卷积进行降维处理,这里降的是通道维,因为后面需要用3x3卷积进行处理,遵循策略2需要减少3x3卷积输入的通道数。expand层由1x1卷积核3x3卷积混合组成,然后将两种卷积的输出在通道维进行拼接。整个过程都没有下采样,因此输出的图像尺寸和输入一样,但是输出的通道数就变成了expand层1x1卷积的输出通道数加上3x3卷积的输出通道数。
以下给出Fire Module的代码:
class Fire(nn.Module):
def __init__(self, inplanes, squeeze_planes, expland1x1_planes, expand3x3_planes):
# 输出的形状为 [batch_size, expand1x1_palnes + expand3x3_planes, H, W]
super(Fire, self).__init__()
self.squeeze = nn.Conv2d(in_channels=inplanes,
out_channels=squeeze_planes,
kernel_size=1) # 用1x1卷积减少通道数
self.squeeze_activation = nn.ReLU(inplace=True)
# 混合卷积,不下采样
self.expand1x1 = nn.Conv2d(in_channels=squeeze_planes,
out_channels=expland1x1_planes,
kernel_size=1)
self.expand1x1_activation = nn.ReLU(inplace=True)
self.expand3x3 = nn.Conv2d(in_channels=squeeze_planes,
out_channels=expand3x3_planes,
kernel_size=3,
padding=1)
self.expand3x3_activation = nn.ReLU(inplace=True)
def forward(self, x):
x = self.squeeze(x)
x = self.squeeze_activation(x)
y1 = self.expand1x1_activation(self.expand1x1(x))
y2 = self.expand3x3_activation(self.expand3x3(x))
return torch.cat((y1, y2), dim=1) # 通道维上拼接
将若干Fire Module进行叠加,其中用最大池化层进行下采样:

class SqueezeNet(nn.Module):
def

本文介绍了SqueezeNet,一种参数量少、模型小的网络结构,通过1x1卷积替换3x3、减少输入通道并延迟下采样来提升效率。FireModule是关键组件,展示了如何设计和实现。SqueezeNet在嵌入式设备和分布式训练中表现出高效性能。
最低0.47元/天 解锁文章
842

被折叠的 条评论
为什么被折叠?



