深度可分离卷积及其代码实现

本文详细解析深度可分离卷积的工作原理,通过逐通道卷积和逐点卷积减少参数,对比普通卷积并提供代码实例。理解其在深度学习中的优势与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度可分离卷积(depthwise separable conv)

一共两步,第一步先进行逐通道卷积(Depthwise Convolution),第二步进行

逐点卷积(Pointwise Convolution)

普通卷积:输入是三个通道,输出是四个通道

这里需要4个卷积核(输出几个通道就要几个卷积核,这里输出四个通道所以需要四个卷积核)

每个卷积核是3*3*3

所以参数总量是4个3*3*3,等于108个参数

 深度卷积:

深度可分离卷积可分为两个过程,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)

(1)逐通道卷积

这里参数量是3个3*3,等于27个

 这样卷积的话,通道数不可改变,而且通道之间的信息也没有进行交互

(2)逐点卷积

这里我们再用四个卷积核,每个卷积核大小为1*1*3

 这样的话,参数总量就是4*1*1*3+27=39

可以看到,参数量大大减少

上面两步合起来就是:

代码实现:

class DepthWiseConv(nn.Module):
    def __init__(self,in_channel,out_channel):

        #这一行千万不要忘记
        super(DepthWiseConv, self).__init__()

        # 逐通道卷积
        self.depth_conv = nn.Conv2d(in_channels=in_channel,
                                    out_channels=in_channel,
                                    kernel_size=3,
                                    stride=1,
                                    padding=1,
                                    groups=in_channel)
        # groups是一个数,当groups=in_channel时,表示做逐通道卷积

        #逐点卷积
        self.point_conv = nn.Conv2d(in_channels=in_channel,
                                    out_channels=out_channel,
                                    kernel_size=1,
                                    stride=1,
                                    padding=0,
                                    groups=1)
    
   def forward(self,input):
        out = self.depth_conv(input)
        out = self.point_conv(out)
        return out
#将普通卷积替换成深度可分离卷积
nn.Conv2d(32,128,kernal_size=3,stride=1,padding=1)

DepthWiseConv(32,128)

 

 

代码实现:

Conv2d(in_channel,out_channel,kernel_size,stride=1,padding=0,dilation=0,groups=1,bias=True)

,就代表在做深度可分离卷积(depth—wise conv)、

本项目是一个基于PyTorch框架实现的通用图像分割系统,支持二分类及多类别分割任务。系统提供从数据预处理到模型训练、验证评估的完整流程,具有高度可配置性和实用性。在数据处理方面,系统支持自定义图像和掩码文件格式(如.jpg、.png等),能自动处理不连续的标签值,并集成数据增强功能以提升模型泛化能力。模型特性上,UNet架构可根据任务需求灵活调整参数,包括输入尺寸、卷积通道数等,同时兼容不同类别数量的分割任务(通过--num_classes参数指定)。训练功能支持GPU加速,提供学习率、批次大小等超参数配置选项,可记录损失曲线和评估指标(如IoU、Dice系数),并自动保存性能最佳的模型权重。 使用流程简明:用户需按规范组织数据集(图像与掩码文件需名称对应且分别存放于images/masks子目录),通过命令行参数即可启动训练,例如指定数据路径(--data_dir)、学习率(--learning_rate)或标签映射规则(--label_mapping)。系统输出包含模型权重文件(.pth)、训练曲线可视化图表及指标日志,便于结果分析。特别注意事项包括:掩码需为单通道灰度图且标签值为整数,多分类任务推荐使用one-hot编码掩码。项目依赖主流科学计算库(PyTorch、NumPy)及可视化工具(Matplotlib),安装简便。该系统适用于医学影像、遥感等领域的语义分割任务,兼顾易用性与扩展性,用户可通过调整UNet深度或添加注意力机制等进一步优化性能。 【项目说明书】包含代码和原理的讲解
### 深度可分离卷积的 PyTorch 实现 深度可分离卷积是一种高效的卷积操作方法,它通过将标准卷积分解为两个更简单的操作来减少计算量和模型参数的数量。具体来说,深度可分离卷积由两部分组成:深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。前者对每个输入通道单独应用卷积核,而后者则通过 \(1 \times 1\) 卷积调整通道数。 以下是基于 PyTorch 的深度可分离卷积实现代码: ```python import torch import torch.nn as nn class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False): super(DepthwiseSeparableConv, self).__init__() # 深度卷积 (Depthwise Convolution): groups=in_channels 表示按通道分组 self.depthwise_conv = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=in_channels, bias=bias)[^2] # 逐点卷积 (Pointwise Convolution): 使用 1x1 卷积改变通道数 self.pointwise_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=bias)[^3] def forward(self, x): # 首先执行深度卷积 x = self.depthwise_conv(x) # 然后执行逐点卷积 x = self.pointwise_conv(x) return x # 测试代码 if __name__ == "__main__": input_tensor = torch.randn(1, 3, 32, 32) # 输入张量形状 [batch_size, channels, height, width] model = DepthwiseSeparableConv(in_channels=3, out_channels=64) output = model(input_tensor) print(output.shape) # 输出应为 [1, 64, 32, 32] ``` 上述代码中,`nn.Conv2d` 中的 `groups` 参数被设置为 `in_channels` 来实现深度卷积。随后,\(1 \times 1\) 卷积用于调整输出通道数并增加非线性能力。 --- #### 关键概念解释 - **深度卷积**:通过对每个输入通道独立地应用卷积核,减少了计算复杂度。其核心在于 `groups=in_channels` 的设定[^2]。 - **逐点卷积**:利用 \(1 \times 1\) 卷积完成跨通道的信息融合,并扩展或压缩特征图的维度。 这种分解方式显著降低了传统卷积所需的计算资源,在移动设备和嵌入式系统中尤为适用。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值