普通卷积
如果输入特征的通道是 32,希望输出特征的通道是 64,对于 3*3 的普通卷积来说,卷积层设置为:
conv = torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
我们查看卷积核的参数量
print(conv.weight.shape) # torch.size([64,32,3,3])
所以普通卷积的参数量是 64 × \times × 32 × \times × 3 × \times × 3 = 18432 个参数
分组卷积
同样输入特征的通道是 32,希望输出特征的通道是 64,如果使用分组卷积,卷积层设置为:
conv = torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, groups=8)
我们查看卷积核的参数量
print(conv.weight.shape) # torch.size([64,4,3,3]) 这里 4 表示 in_channels/groups = 4
所以分组卷积的参数量是 64 × \times × 4 × \times × 3 × \times × 3 = 2304 个参数, 同样的输出通道,参数减小了8倍
为了达到同样的输出效果,分组卷积的做法是:
- 把32个输入通道分为8组,每组4个通道
- 把64 × \times × 4 × \times × 3 × \times × 3卷积核分为8组,每组参数量是 8 × \times × 4 × \times × 3 × \times × 3
- 这样8组输入和8组卷积核一一对应做普通卷积,就可以得到8组输出通道为8的输出特征,将8组输出结果拼接在一起,就可以得到64个通道的输出结果