# 优化实践 | 大改ShuffleNetV2网络，注意力机制，csp，卷积裁剪…（附全部开源代码）

1、背景介绍

2、提升精度措施

3、降低计算量

shufflenet_se网络

shufflenet_sk网络

shufflenet_liteconv网络

shufflenet_k5网络

shufflenet_csp网络

4、实验测试

5、总结

1.背景

，包括

2、提升精度措施

shufflenet_se网络

shufflenet_sk网络

shufflenet_k5网络

3、降低计算量

shufflenet_se网络

class SeAttention(nn.Module):    def __init__(self, channel_num, r=4):        """ Constructor        """        super(SeAttention, self).__init__()        self.channel_num = channel_num        self.r = r        self.inter_channel = int( float(self.channel_num) / self.r)        self.fc_e1 = torch.nn.Linear(channel_num, self.inter_channel)        self.relu_e1 = nn.ReLU(inplace=True)        self.fc_e2 = torch.nn.Linear(self.inter_channel, channel_num)         def forward(self, x):        y = torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze()        y = self.fc_e1(y)        y = self.relu_e1(y)        y = self.fc_e2(y)        y = torch.sigmoid(y).unsqueeze(-1).unsqueeze(-1)        return x*y

shufflenet_sk网络

class SKConv(nn.Module):    def __init__(self, in_channels):        """ Constructor        Args:            in_channels: input channel dimensionality.            M: the number of branchs.        """        super(SKConv, self).__init__()        r = 2.0        L = 32        d = max(int(in_channels / r), L)        self.in_channels = in_channels        self.conv1 = nn.Sequential(            self.depthwise_conv(in_channels, in_channels, kernel_size=3, dilation=1, padding=1),            nn.BatchNorm2d(in_channels),            #nn.ReLU(inplace=False)            )        self.conv2 = nn.Sequential(            self.depthwise_conv(in_channels, in_channels, kernel_size=3, dilation=2, padding=2),            nn.BatchNorm2d(in_channels),            # nn.ReLU(inplace=False)            )        self.fc1 = nn.Linear(in_channels, d)        self.fc2 = nn.Linear(d, in_channels*2)        self.softmax = nn.Softmax(dim=1)   def forward(self, x):       U1 = self.conv1(x)       U2 = self.conv2(x)       U = U1 + U2       S = U.mean(-1).mean(-1)       Z1 = self.fc1(S)       Z2 = self.fc2(Z1)       A = self.softmax(Z2)       V = U1 * A[:,:self.in_chanels].unsqueeze(-1).unsqueeze(-1) + \           U2 * A[:,self.in_channels:].unsqueeze(-1).unsqueeze(-1)       return V

shufflenet_liteconv网络

shufflenet_k5网络

shufflenet_csp网络
csp在大型网络上取得了很大的成功。它在每个stage，将输入split成两部分，一部分经过原来的路径，另一部分直接shortcut到stage的尾部，然后concat到一起。这既降低了计算量，又丰富了梯度信息，减少了梯度的重用，是一个非常不错的trip。在yolov4，yolov5的目标检测中，也引入了csp机制，使用了csp_darknet。此处将csp引入到shufflenet中。并且对csp做了一定的精简，最终使用csp stage精简版本作为最终的网络结构。

4、实验测试

 网络结构 Top1 实测 flops （M） 参数规模 （M） 模型文件大小 shufflenet(baseline) 0.880 147.79 1.263 5116K shufflenet_se 0.884 147.93 1.406 5676K shufflenet_sk 0.885 152.34 1.555 6872K shufflenet_liteconv 0.879 104.77 0.923 3736K shufflenet_k5 0.891 155.18 1.303 5268K shufflenet_csp 0.862 101.96 0.924 3776K

5、总结

© THE END

”知识星球一年有余，也得到很多同学的认可，我们定时会推送实践型内容与大家分享，在星球里的同学可以随时提问，随时提需求，我们都会及时给予回复及给出对应的答复。

”，请扫二维码加入我们。我们会按照你的需求将你拉入对应的学习群！

“。之后我们会针对相应领域分享实践过程，让大家真正体会