![深度学习视频理解](https://wfqqreader-1252317822.image.myqcloud.com/cover/920/43737920/b_43737920.jpg)
2.1.15 ShuffleNet
ShuffleNet(打散网络)(Zhang et al.,2018b)和MobileNet(见 2.1.13 节)的动机相同,都是利用分组卷积设计精简的网络结构。
相比于标准卷积(如图2-23(a)所示)中每个输出神经元和输入感受野内的所有通道相连,分组卷积(如图2-23(b)所示)将输入通道进行分组,每个输出神经元只和输入特征对应分组的通道相连,分组卷积的不同分组使用不同的卷积核独立对该分组的输入特征进行卷积。因此,分组卷积的一个弊端是各个分组之间没有信息交互,即每个分组没有考虑其他分组的信息,这限制了分组卷积的表示能力。
为了让分组卷积的各个分组之间信息产生交互,MobileNet 使用Pointwise卷积(即卷积)来综合特征各个通道之间的信息。相比于Depthwise卷积,Pointwise卷积的参数量和计算量更大(见 2.1.13 节)。因此 ShuffleNet 希望对于Pointwise卷积也使用分组卷积,用于降低整体的计算量,但是使用
分组卷积之后仍然会面临不同分组之间没有信息交互的问题。
为了克服分组卷积之后各通道之间没有信息交互的问题,ShuffleNet在分组卷积之后进行通道打散(Channel Shuffling)操作,如图2-23(c)所示。通过通道打散操作,相当于对通道进行重新排序,可以使得输出通道同时接收不同分组的信息。IGC(Zhang et al.,2017)也提出了类似的想法。
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_233.jpg?sign=1738837992-i3Q95AyYgfjLjKDhYjyiJ43eV8gaUTL9-0-5950084e8e183d43df5b25fed8539e9c)
图2-23 通道打散操作
ShuffleNet 网络的基本结构如图2-24所示。从图2-24(a)带瓶颈结构的MobileNet模块出发,ShuffleNet(如图2-24(b)所示)将其中的两个卷积都换成分组卷积,其中分组数
是一个超参数,并在第一个
分组卷积和Depthwise卷积之间增加一个通道打散模块。为了减少信息损失,去掉了Depthwise卷积之后的ReLU激活函数(见2.1.14节)。图2-24(b)适用于输入特征和输出特征维度一致的情况,当输入特征和输出特征空间维度不一致时,即该模块需要进行空间维度的下采样时,如图2-24(c)所示,将Depthwise卷积中的步长改为2,同时向短路分支加入卷积核维度为
、步长为2的平均汇合,最后两个分支使用特征拼接而不是相加,以达到通道数翻倍、空间维度减半的目的。
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_238.jpg?sign=1738837992-wdMjyTe5Ky5ovxP2RkHtvZdPK9GfSJGJ-0-7f94342904e495f9c114534d9134f542)
图2-24 ShuffleNet 网络结构
在实现的时候,ShuffleNet中的通道打散操作并不是随机打散的,而是有规律地对通道进行重新排序。具体地说,假设特征有个通道,分为
组,首先将特征的维度由
拆分成
,然后将前两维进行转置,转置后的维度为
,最后重新组合成维度为
的输出特征。此时,虽然输入特征和输出特征维度相同,但是通道内部进行了重新排序。
为了方便理解上述过程,以为例,此时输入特征是一个一维向量
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_246.jpg?sign=1738837992-ENGYUt3MZCcuJzoC6LDoobCEINedS4Te-0-b938c8f66a0a986f79666d32ec187a28)
(2.12)
位于第一个分组,
位于第二个分组。通道打散首先将输入维度拆分为
,即按行优先顺序变成一个二维矩阵,然后转置成为一个
的矩阵
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_251.jpg?sign=1738837992-xoisnimwkb34oHjhvfjF7tWaptJriqUB-0-2e71ba04da65ee3404282696b8e3f2e4)
(2.13)
最后按行优先顺序重新组合为一个一维向量
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_252.jpg?sign=1738837992-wi5OX4rpbghEZTjP58RogZrHCCRefUlJ-0-62d961139b5116329a1a5cb1d75cdb51)
(2.14)
和最初的向量相比,打散后的向量
维度和
相同,但是元素顺序发生了改变。例如,
中第一个分组的元素为
,但是
中第一个分组的元素变为了
。
ShuffleNet中通道打散的PyTorch 代码实现如下(代码改编自“链接1”):
![img](https://epubservercos.yuewen.com/E5C1AE/23020634309724506/epubprivate/OEBPS/Images/txt002_260.jpg?sign=1738837992-Df63mxqPINkBwOmn5o0o44H80rbQcguC-0-e5683cb329bc9f03b9585acb3cba4a50)