【 深度可分离卷积】

深度可分离卷积

深度可分离卷积(Depthwise Separable Convolution)是一种在卷积神经网络中减少计算量和参数数量的技术。这种技术将标准的卷积操作分解为两个更简单的操作:逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。逐通道卷积对输入特征图的每个通道独立应用一个卷积核,而逐点卷积则使用1×1的卷积核将逐通道卷积的输出合并成最终的特征图。

MobileNet是一个著名的轻量级深度学习模型,它专为移动和嵌入式视觉应用设计。MobileNet架构大量使用了深度可分离卷积,从而在保持准确度的同时显著减少了模型的大小和计算需求。MobileNet系列模型,包括MobileNetV1、MobileNetV2和MobileNetV3,都采用了这种技术,使得它们非常适合在资源受限的设备上运行。

MobileNetV1是2017年由谷歌公司提出的,它通过使用深度可分离卷积,大幅度降低了模型的计算量和参数量,使得深度学习的智能化技术可以在端侧设备、边缘设备上开始应用。MobileNetV2进一步改进了V1的设计,引入了倒置残差结构(Inverted Residuals)和线性瓶颈(Linear Bottlenecks),以提高模型的效率和准确性。MobileNetV3则通过神经网络搜索(Neural Architecture Search, NAS)技术,自动寻找最优的网络结构,进一步提升了模型性能。

在MobileNet系列中,深度可分离卷积的计算量主要集中在1×1的卷积上,这使得模型能够以较低的计算成本实现高效的特征提取。此外,MobileNetV3还引入了新的激活函数h-swish和SiLU,以及对网络的不同部分使用不同的训练策略,以进一步提升性能。

深度可分离卷积和普通卷积的参数量和计算量比较

深度可分离卷积(Depthwise Separable Convolution)是一种卷积神经网络中的特殊卷积操作,它将标准的卷积操作分解为两个步骤:深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。这种分解可以显著减少参数数量和计算量,而且通常可以在保持模型性能的同时提高效率。

考虑一个标准的卷积操作,输入通道数为(C_{\text{in}}),输出通道数为(C_{\text{out}}),卷积核大小为(k \times k),则其参数量和计算量如下:

  1. 参数量(Standard Convolution):
    参数数量 = (C_{\text{in}} \times C_{\text{out}} \times k \times k)

  2. 计算量(Standard Convolution):
    计算次数 = (C_{\text{in}} \times C_{\text{out}} \times k \times k \times H_{\text{out}} \times W_{\text{out}})
    其中(H_{\text{out}})和(W_{\text{out}})是输出特征图的高度和宽度。

现在来比较深度可分离卷积和普通卷积的参数量和计算量:

  1. 深度可分离卷积参数量:
    深度卷积参数数量 = (C_{\text{in}} \times k \times k)
    逐点卷积参数数量 = (C_{\text{in}} \times C_{\text{out}})
    总参数数量 = 深度卷积参数数量 + 逐点卷积参数数量

  2. 深度可分离卷积计算量:
    深度卷积计算次数 = (C_{\text{in}} \times k \times k \times H_{\text{out}} \times W_{\text{out}})
    逐点卷积计算次数 = (C_{\text{in}} \times C_{\text{out}} \times H_{\text{out}} \times W_{\text{out}})
    总计算次数 = 深度卷积计算次数 + 逐点卷积计算次数

pytorch实现

深度可分离卷积(Depthwise Separable Convolution)在PyTorch中的实现通常涉及两个主要步骤:逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution):

import torch
import torch.nn as nn
import torch.nn.functional as F

class DEPTHWISECONV(nn.Module):
    def __init__(self, in_ch, out_ch):
        super(DEPTHWISECONV, self).__init__()
        # Depthwise Convolution
        self.depth_conv = nn.Conv2d(in_channels=in_ch,
                                     out_channels=in_ch,
                                     kernel_size=3,
                                     stride=1,
                                     padding=1,
                                     groups=in_ch)
        # Pointwise Convolution
        self.point_conv = nn.Conv2d(in_channels=in_ch,
                                     out_channels=out_ch,
                                     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

# Example usage:
# Initialize the depthwise separable convolution module
dsc_module = DEPTHWISECONV(in_ch=3, out_ch=4)

# Create a random tensor to represent an input with 3 channels, 32x32 spatial dimensions
input_tensor = torch.randn(1, 3, 32, 32)

# Pass the input through the module to get the output
output_tensor = dsc_module(input_tensor)

# Print the size of the output tensor
print(output_tensor.size())  # Should output the shape of the tensor after depthwise separable convolution
  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stsdddd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值