目录
前言
解决的问题:分组卷积的输出之和前面部分输入相关。
提出shufflenet unit. 在1x1的卷积后,把组内的特征,再分成g组,随机关联到后面的g组,然后对每一组都如此。
论文
ShufflfleNet: An Extremely Effificient Convolutional Neural Network for Mobile
Devices
https://arxiv.org/pdf/1707.01083v1.pdf
shufflenet unit原理
图片(a) 正常的group conv,输出之和前面部分输入相关;
图(b) 红色部分的特征,三块分别与下面三块相关,其他颜色一样。
图(c) channel shuffle红色部分随机与下面的三部分相关,其他颜色一样。
shufflenet unit实现
mmclassification上的实现形式如下
def channel_shuffle(x, groups):
"""Channel Shuffle operation.
This function enables cross-group information flow for multiple groups
convolution layers.
Args:
x (Tensor): The input tensor.
groups (int): The number of groups to divide the input tensor
in the channel dimension.
Returns:
Tensor: The output tensor after channel shuffle operation.
"""
batch_size, num_channels, height, width = x.size() # (128,64,224,224)
assert (num_channels % groups == 0), ('num_channels should be '
'divisible by groups')
channels_per_group = num_channels // groups # group = 2
x = x.view(batch_size, groups, channels_per_group, height, width) # (128, 2, 32, 224, 224)
x = torch.transpose(x, 1, 2).contiguous() # (128, 32, 2, 224, 224)
x = x.view(batch_size, -1, height, width) # (128, 64, 224, 224)
return x
举例说明
其实就是三步,详细解释下
假如input shape是(1, 15, 1, 1),值是
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
(1) x = x.view(batch_size, 3, 5, height, width)
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]
(2) x = torch.transpose(x, 1, 2).contiguous()
[1, 6, 11],
[2, 7, 12],
[3, 8, 13],
[4, 9, 14],
[5, 10, 15]
(3) x = x.view(batch_size, -1, height, width) # 先列后行
1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14, 5, 10, 15