对于组卷积(group convolutional)的理解(torch.nn.Conv2d中的group参数)

最近开始学习使用pytorch,在学习他人的mobilenetv1过程中发现了nn.torch.Conv2dgroup这个参数,下面是torchdepthwise

def conv_dw(inp, oup, stride):
            return nn.Sequential(
            # depthwise 
                nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
                nn.BatchNorm2d(inp),
                nn.ReLU(inplace=True),
		   
		   # pointwise
                nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True),
            )

depthwise其实就是group=input_channel的时候,那么理解好这个group也就能更好的利用卷积啦。


咱们先来看看普通的卷积神经网络,为了说明发表我都尽量使用图像来表示(原谅我的画画水平还有M-pencil的漏墨情况严重@华为官方!)

普通卷积神经网络

[1] 对于一个filter,它其实是一个通道对应一个kernel,所有通道的kernel组成一个filter。
以上十分重要!! ,我一直以为只有一个kernel扫过所有的input_feature得到一张feature map

[2] 理解参数数目:根据上面的想法,假设

  • 输入为 [N,H,W,C]
  • num_output_channelCO
  • kernel_sizek

那么一个filter的参数数目为k*k(使用正方形kernel,现在也有非对称卷积1
如[1]所说,有C个kernel,所以一个filter有 kxkxc 个参数。num_output_channel=CO说明有 CO 个filter,则参数数目为 COxkxkxc

图来啦
在这里插入图片描述

组卷积神经网络

有了基础,理解组就十分简单了,组卷积其实就是将input分解成group个组,然后进行卷积就好了。

=======> 一个filter只需要 C_input / group个kenel就好啦!
在这里插入图片描述


这有一个关于卷积其他参数的动画介绍(padding,dialation),很有意思

最近在stackoverflow上提了一个有意思的问题,虽然被疯狂点灭(现在好像回来了?),但是我下了挺多功夫。是关于pytorch重载的模型不能预测和继续训练的问题。好好学习吧!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章