免费产品网站建设,建设网站需要的资源,专注做动漫的门户网站,新增网站推广一、逐点卷积 当前先进的轻量化网络大都使用深度可分离卷积或组卷积#xff0c;以降低网络的计算量#xff0c;但这两种操作都无法改变特征图的通道数#xff0c;因此需要使用11的卷积。总体来说#xff0c;逐点的11卷积有如下两点特性#xff1a; 可以促进通道之间的信息…一、逐点卷积 当前先进的轻量化网络大都使用深度可分离卷积或组卷积以降低网络的计算量但这两种操作都无法改变特征图的通道数因此需要使用1×1的卷积。总体来说逐点的1×1卷积有如下两点特性 可以促进通道之间的信息融合改变通道至指定维度。 轻量化网络中1×1卷积占据了大量的计算并且致使通道之间充满约束一定程度上降低了模型的精度。 为了进一步降低计算量ShuffleNet提出了通道混洗的操作通过通道混洗也可以完成通道之间信息的融合。
二、通道混洗
1. 实现思想 图2-1 通道混洗操作示意图 图2-1中a图代表了常规的两个组卷积操作可以看到如果没有逐点的1×1卷积或者通道混洗最终输出的特征仅由一部分输入通道的特征计算得出这种操作阻碍了信息的流通进而降低了特征的表达能力。 因此我们希望在一个组卷积之后能够将特征图之间的通道信息进行融合类似于图2-1中b操作将每一个组的特征分散到不同的组之后再进行下一组卷积这样输出的特征就能够包含每一个组的特征而通道混洗恰好能够实现这个过程如图2-1的c所示。
2. 实现过程 通道混洗可以通过几个常规的张量操作巧妙地实现如图2-2所示。为了更好地讲解实现过程这里对输入通道做了1-12的编号一共包含3个组每个组包含4个通道。 图2-2 通道混洗的具体实现过程 下面详细介绍混洗过程中使用到的3个操作
Reshape首先将输入通道的一个维度Reshape成两个维度一个是卷积组数一个是每个卷积包含的通道数。Transpose将扩展出的两维进行置换。Flatten将置换后的通道Flatten平展后即可完成最后的通道混洗。
3. 代码示例
def channel_shuffle(x, groups):batchsize, num_channels, height, width x.data.size()channels_per_groups num_channels // groups# Reshape操作将通道扩展为两维x x.view(batchsize, groups, channels_per_group, height, width)# Transpose操作将组卷积两个维度进行置换x torch.transpose(x, 1, 2).contiguous()# Flatten操作两个维度平展成一个维度x x.view(batchsize, -1, height, width)return x