深度可分离卷积实例讲解 python

import torch

'''
此处应用深度可分离卷积的过程是
①用in_channel个2×2大小的卷积核(1通道:因为设置groups=in_channel,把输入划分in_channel份,使得每份的输入成了单通道,故每个卷积核也是单通道),
分别与输入的in_channel通道的数据做卷积(这里使用了in_channel个1通道的卷积核,输入数据的每个通道对应1个2×2的卷积核卷积),
得到了in_channel个通道的特征图,我们说该步操作是depthwise(逐层)的,在叠加16个特征图之前
②接着用 in_channel*4 个1×1大小的卷积核(in_channel通道)在这in_channel个特征图进行卷积运算,将in_channel个通道的信息进行融合
(用1×1的卷积进行不同通道间的信息融合),我们说该步操作是pointwise(逐像素)的。
这样我们可以算出整个过程使用了: 2×2×in_channel+(1×1×in_channel)×(in_channel*4) 个参数。
'''
class Net(torch.nn.Module):
    def __init__(self, in_channel):
        super(QNetV2, self).__init__()

        self.sequential = torch.nn.Sequential(
            torch.nn.Conv2d(in_channel, in_channel, 2, 2, groups=in_channel),##深度卷积,因为输入的分组数g取in_channel,故输出通道数就是g个(即in_channel)
            torch.nn.BatchNorm2d(in_channel),
            torch.nn.LeakyReLU(0.1,inplace=True),##inplace=True表示进行原地操作,对上一层传递下来的tensor直接进行修改,如x=x+3。这样可以节省运算内存,不用多存储变量

            torch.nn.Conv2d(in_channel, in_channel * 4, 1, 1),#点卷积,用1*1不会改大小,上步把图已经缩减为原来的1/4,为了不发生因卷积而信息丢失(参数量减少),这步需要把通道数扩增为4倍
            torch.nn.BatchNorm2d(in_channel*4),
            torch.nn.LeakyReLU(0.1, inplace=True),
            torch.nn.PixelShuffle(2), #输入: (N,C*r^2,H,W), 输出: (N,C,H*r,W*r),上采样使得尺寸不变
        )

    def forward(self, input):
        return self.sequential(input) + input

辅助理解 https://www.cnblogs.com/marsggbo/p/9737991.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值