pytorch的conv2d函数groups分组卷积使用及理解

重点在于groups参数的理解

1、groups参数是如何影响卷积计算的

conv = nn.Conv2d(in_channels=6, out_channels=6, kernel_size=1, groups=3)
conv.weight.data.size()

输出:

torch.Size([6, 2, 1, 1])

(此时转置参数Transposed默认为False,源码如下)

pytorch的conv2d函数groups分组卷积使用及理解_第1张图片

当group=1时,该卷积层需要6*6*1*1=36个参数,即需要6个6*1*1的卷积核

计算时就是6*H_in*W_in的输入整个乘以一个6*1*1的卷积核,得到输出的一个channel的值,即1*H_out*W_out。这样经过6次与6个卷积核计算就能够得到6*H_out*W_out的结果了

 

如果将group=3时,卷积核大小为torch.Size([6, 2, 1, 1]),即6个2*1*1的卷积核,只需要需要6*2*1*1=12个参数

那么每组计算就只被in_channels/groups=2个channels的卷积核计算,当然这也会将输入分为三份大小为2*H_in*W_in的小输入,分别与2*1*1大小的卷积核进行三次运算,然后将得到的3个2*H_out*W_out的小输出concat起来得到最后的6*H_out*W_out输出

在实际实验中,同样的网络结构下,这种分组的卷积效果是好于未分组的卷积的效果的。

2、为什么要设置groups参数,有什么优点?

为了在GPU上并行计算:

标准卷积的计算如下图:

举个例子,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。
那么一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到的输出是只有一个通道的数据。之所以会得到一通道的数据,是因为刚开始3×3×16的卷积核的每个通道会在输入数据的每个对应通道上做卷积,然后叠加每一个通道对应位置的值,使之变成了单通道,那么32个卷积核一共需要(3×3×16)×32 =4068个参数。

pytorch的conv2d函数groups分组卷积使用及理解_第2张图片

分组卷积的计算:

pytorch的conv2d函数groups分组卷积使用及理解_第3张图片

pytorch的conv2d函数groups分组卷积使用及理解_第4张图片

卷积的几种常见操作可以参见:

https://blog.csdn.net/chenyuping333/article/details/82531047?utm_source=blogxgwz6 

另外标准卷积的详细计算图可表示为:

 

你可能感兴趣的:(机器学习,卷积,python)