PyTorch实现深度可分离卷积(以MobileNet为例)

介绍深度可分离卷积之前首先要先介绍一下分组卷积。

分组卷积

参考链接[1]已经将分组卷积介绍的比较详细了,这里就不再赘述。原理可以参考一下参考链接。但是这篇文章对于分组卷积的具体代码讲解,感觉不太好。这里对于分组卷积着重介绍一下代码讲解。

直接调用torch.nn.Conv2d()就可以实现分组卷积。在Conv2d里面有一个参数叫groups,这个参数是实现这一功能的关键。下面详细解介绍一下这个参数。

groups

通过groups来实现分组卷积的操作。groups默认为1,也就是说将输入分为一组,此时是常规卷积。groups数值为几表示的就是将输入通道分为几组。当groups=in_channels的时候,表示的就是将输入的每一个通道都作为一组,然后分别对其进行卷积,输出通道数为k,最后再将每组输出串联,最后通道数为in_channels*k

为了详细说明这一点,我们来举几个具体例子。为了接下来方便计算,这里bias=False,另外用到了torchsummary模块,可以通过pip安装。

import torch
from torchsummary import summary
import torch.nn as nn

class CSDN_Tem(nn.Module):
    def __init__(self, in_ch, out_ch, groups):
        super(CSDN_Tem, self).__init__()
        self.conv = nn.Conv2d(
            in_channels=in_ch,
            out_channels=out_ch,
            kernel_size=3,
            stride=1,
            padding=1,
            groups=groups,
            bias=False
        )

    def forward(self, input):
        out = self.conv(input)
        return out

测试时,使用的是64*64*3的输入,你可以想象为一个64*64大小的图片输入。一个3*3大小的卷积核处理,最后输出的shape是64*64*30。

我们先是group为1的常规卷积操作。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
conv = CSDN_Tem(3
  • 35
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Einstellung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值