理解分组卷积

理解分组卷积

码农世界 2024-05-18 前端 75 次浏览 0个评论
Conv2d(in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode=‘zeros’)
  • in_channels:输入的通道数目 【必选】

  • out_channels:输出的通道数目 【必选】

  • kernel_size:卷积核的大小,类型为int 或者元组,当卷积是方形的时候,只需要一个整数边长即可,卷积不是方形,要输入一个元组表示 高和宽。【必选】

  • stride:卷积每次滑动的步长为多少,默认是 1 【可选】

  • padding:设置在所有边界增加 值为 0 的边距的大小(也就是在feature map 外围增加几圈 0 ),例如当 padding =1 的时候,如果原来大小为 3 × 3 ,那么之后的大小为 5 × 5 。即在外围加了一圈 0 。【可选】

  • dilation:控制卷积核之间的间距【可选】

  • groups:控制输入和输出之间的连接【可选】

  • bias:是否将一个 学习到的 bias 增加输出中,默认是 True 。【可选】

  • padding_mode :字符串类型,接收的字符串只有 “zeros” 和 “circular”。【可选】

    groups:分组卷积

    比如 groups 为1,那么所有的输入都会连接到所有输出

    当 groups 为 2的时候,相当于将输入分为两组,并排放置两层,每层看到一半的输入通道并产生一半的输出通道,并且两者都是串联在一起的。这也是参数字面的意思:“组” 的含义。

    需要注意的是,in_channels 和 out_channels 必须都可以整除 groups,否则会报错

    Convolution 层的参数中有一个group参数,其意思是将对应的输入通道与输出通道数进行分组, 默认值为1, 默认输出输入的所有通道各为一组。比如输入数据大小为90x100x100x32,通道数32,要经过一个3x3x48的卷积,group默认是1,就是全连接的卷积层。

    如果group是2,那么对应要将输入的32个通道分成2个16的通道,将输出的48个通道分成2个24的通道。对输出的2个24的通道,第一个24通道与输入的第一个16通道进行全卷积,第二个24通道与输入的第二个16通道进行全卷积。

    极端情况下,输入输出通道数相同,比如为24,group大小也为24,那么每个输出卷积核,只与输入的对应的通道进行卷积。

    分组卷积对输入通道数的影响

    1.当设置group=1时:

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

    返回:

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

    另一个例子:​​​​​​​

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

    返回:

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

    可见第一个值为out_channels的大小,第二个值为in_channels的大小,后面两个值为kernel_size

    2.当设置为group=2时​​​​​​​

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

    返回:

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

    3.当设置group=3时​​​​​​​

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

    返回:

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

    4.当设置group=4时

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

    报错:

    ValueError: in_channels must be divisible by groups

    groups的值必须能整除in_channels,同样也要求groups的值必须能整除out_channels

    总结:其实就是将输入通道数变为 输入通道数/groups,输出通道数不变,总共计算groups次

    示意图

    不分组:

    分两组:

    分四组:

    最后:

    如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

     

转载请注明来自码农世界,本文标题:《理解分组卷积》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,75人围观)参与讨论

还没有评论,来说两句吧...

Top