深度可分离卷积

这篇具有很好参考价值的文章主要介绍了深度可分离卷积。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常规卷积

常规卷积:卷积核与输入的每个通道都进行卷积操作;
假设输入层为一个大小为64×64像素、三通道彩色图片,经过一个包含4个Filter的卷积层,最终输出4个Feature Map,且尺寸与输入层相同。
深度可分离卷积
卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。
卷积层的参数数量可以用如下公式来计算(即:卷积核W x 卷积核H x 输入通道数 x 输出通道数):
4 × 3 × 3 × 3 = 108

深度可分离卷积

深度可分离卷积(Depthwise Separable Convolution,DSC)用于减少网络参数,提升计算效率;它的核心思想是将一个完整的卷积运算分解为两步进行,分别为Depthwise Convolution和Pointwise Convolution,详细结构如图所示:
深度可分离卷积

Depthwise Convolution 逐通道卷积

常规卷积卷积核需要与输入的每个通道都进行卷积操作,而Depthwise对输入feature map的每个通道分别使用一个卷积核,然后将所有卷积核的输出再进行拼接得到它的最终输出,如图:
深度可分离卷积
还用上面那个例子,这里的Filter的数量与上一层的Depth相同。所以一个三通道的图像经过运算后生成了3个Feature map,参数量为:
3x3x3=27
深度可分离卷积

Pointwise Convolution 逐点卷积

Pointwise Convolution实际为1×1卷积,与常规卷积运算相同,在DSC中它起两方面的作用:
第一个作用是让DSC能够自由改变输出通道的数量;
第二个作用是对Depthwise Convolution输出的feature map进行通道融合;
深度可分离卷积

用1*1的卷积组合不同深度卷积的输出,得到一组新的输出。卷积核的尺寸为 1×1×M,M为上一层的depth。这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个Filter就有几个Feature map,参数量为:
1x1x3x4=12;

因此,深度可分离卷积的参数个数为27+12=39。

pytorch 实现可分离卷积

可以使用 torch.nn.Conv2d() 中的卷积组参数 groups,来实现深度可分离卷积。groups 参数是用于控制输入和输出的连接的,表示要分的组数(in_channels 和 out_channels 都必须能被 groups 参数整除)。例如:

  • 当 groups =1 (默认值)时,就是同普通的卷积;
  • 当 groups=n 时,相当于把原来的卷积分成 n 组,每组 in_channels/n 的输入与 out_channels/n 个 kernel_size x kernel_size x in_channels/n的卷积核卷积,生成 out_channels/n 的输出 ,然后将各组输出连接起来,形成完整的 out_channels 的输出;
  • 当 groups = in_channels 时,每个输入通道都只跟 out_channels/in_channels 个卷积核卷积; out_channels = in_channels 时就是 Depthwise 卷积。
    深度可分离卷积
import torch
from torchsummary import summary

class myGroupConv(torch.nn.Module):
    def __init__(self):
        super(myGroupConv, self).__init__()
        self.conv2d = torch.nn.Conv2d(in_channels=4,
                                      out_channels=8,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1,
                                      groups=1,
                                      bias=False)
        self.relu = torch.nn.ReLU()

    def forward(self, x):
        x = self.conv2d(x)
        x = self.relu(x)

        return x

class depthwise_separable_conv(torch.nn.Module):
    def __init__(self, ch_in, ch_out):
        super(depthwise_separable_conv, self).__init__()
        self.ch_in = ch_in
        self.ch_out = ch_out
        self.depth_conv = torch.nn.Conv2d(ch_in, ch_in, kernel_size=3, padding=1, groups=ch_in, bias=False)
        self.point_conv = torch.nn.Conv2d(ch_in, ch_out, kernel_size=1, bias=False)

    def forward(self, x):
        x = self.depth_conv(x)
        x = self.point_conv(x)
        return x

class mydspConv(torch.nn.Module):
    def __init__(self):
        super(mydspConv, self).__init__()
        self.conv2d = depthwise_separable_conv(4, 8)
        self.relu = torch.nn.ReLU()

    def forward(self, x):
        x = self.conv2d(x)
        x = self.relu(x)

        return x

device = torch.device("cuda" )
model_1 = myGroupConv().to(device)
summary(model_1, (4, 3, 3))

model_2 = mydspConv().to(device)
summary(model_2, (4, 3, 3))

结果:
深度可分离卷积
说明:
输入尺寸:3x3x4
输出尺寸:3x3x8文章来源地址https://www.toymoban.com/news/detail-449717.html

  1. 常规卷积,group=1,参数量:3x3x4x8=288;测试代码中偏置设为False,所以不加上偏置的参数量,若设为true,则参数量还需要加上等于输出通道个数的偏执量的个数,等于296;
  2. 深度可分离卷积:
  • 逐通道卷积:groups=输入通道数,输出通道数=输入通道数,kernel_size=3,每一个卷积核只在一个通道上进行卷积,其参数量=3×3×4=36
  • 逐点卷积:kernel_size=1, 其参数量=1×1×4×8=32;
    总参数量=36 + 32 = 68

到了这里,关于深度可分离卷积的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么深度学习网络越往后卷积核通道数越大

    在深度神经网络中,通常将前面的卷积层设计为 提取较为基础的特征(物理轮廓、边缘、颜色、纹理) ,后面的卷积层则负责 进一步提取更加高级的特征(和类别相关的抽象特征) 。因此,后面的卷积层需要更加复杂、抽象的特征表达能力,才能有效地提取更好的特征。 为了增

    2024年02月13日
    浏览(37)
  • 40 深度学习(四):卷积神经网络|深度可分离卷积|colab和kaggle的基础使用

    卷积神经网络的基本结构 1: (卷积层+(可选)池化层) * N+全连接层 * M(N=1,M=0) 卷积层的输入和输出都是矩阵,全连接层的输入和输出都是向量,在最后一层的卷积上,把它做一个展平,这样就可以和全连接层进行运算了,为什么卷积要放到前面,因为展平丧失了维度信息,因

    2024年02月08日
    浏览(31)
  • 【论文笔记合集】卷积神经网络之深度可分离卷积(Depthwise Separable Convolution)

    本文作者: slience_me 我看的论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 假设输入为D F ×D F ×M,输出为输入为D F ×D F ×N,卷积核为D K ×D K ×M,共有N个卷积核进行卷积操作 下图为标准的卷积过程,每个卷积核对输入的向量进行卷积操作,得到一个

    2024年01月16日
    浏览(29)
  • 卷积原理(卷积,padding填充,步长,多通道卷积)

    卷积可以用于对输入数据进行特征提取,特征提取的过程可以理解为通过卷积对输入特征进行加权运算,提取输入中的重要信息。 卷积运算的过程就是通过卷积核扫描输入矩阵的元素,将卷积核和扫描对应的元素相乘再相加,得到一个输出,通过不断地滑动,得到最后的输出

    2024年02月09日
    浏览(32)
  • YOLOv8独家改进: 多种新颖的改进方式 | 保持原始信息-深度可分离卷积(MDSConv) | 全局感受野的空间金字塔 (Improve-SPPF)算法 | CA注意力改进版

    深度可分离卷积💡💡💡 本文自研创新改进:改进1)保持 原始信息-深度可分离卷积(MDSConv) , 解决了不能与原始特征层通道之间的信息交互的问题(如经典的深度可分离卷积); 改进2)提出快速的 全局感受野的空间金字塔 ( Improve-SPPF )算法 ,融合局部感受野和全局感受野,

    2024年02月03日
    浏览(33)
  • 图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

    卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征,常用于图像、语音等信号处理任务中。 卷积层有以下几个参数: 卷积核:卷积层中包含若干个卷积核,每个卷积核都是一个二维权重矩阵。卷积核的大小通常是奇数,比如3x3、5x5等,以便

    2024年02月12日
    浏览(31)
  • 卷积核如何改变通道数

    卷积核如何改变通道数? 1:如果是240*240彩色图像,它有RGB三通道。 2:使用任意大小的卷积核与其三个通道分别相卷积,如果是3*3的卷积核,就是3*3的卷积核与3个通道都各卷积一次,得到卷积后的三个通道,将三个通道对应位置相加得到一张图片,就是一个通道, 3:将此

    2024年02月13日
    浏览(25)
  • Python音频双通道分离:实现左右声道分离

    本文介绍了如何使用Python和scipy库来分离音频文件的左右声道。详细的代码示例和步骤都在这里!

    2024年04月11日
    浏览(39)
  • 图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化

    卷积神经网络的一些基本概念: 图像卷积、步长、填充 、 特征图、多通道卷积 、 权重共享 、感受野、池化 图像卷积 :卷积核矩阵在一个原始图像矩阵上 “从上往下、从左往右”滑动窗口进行卷积计算,然后将所有结果组合到一起得到一个新的矩阵的过程。(图1.13) 用

    2024年02月20日
    浏览(26)
  • 使用opencv c++完成图像中水果分割(分水岭、形态学操作、通道处理)单独标记每个水果

    2023.4.16日更新 1. 利用一阶矩增加了草莓等水果的质心绘制。 2. 绘制出了生长方向。 原为本人机器人视觉作业。参考文章http://t.csdn.cn/eQ0qp(目测是上一届的学长) 要求:在网络上寻找水果重叠在一起的图片、经过一系列图像处理,完成每个水果的分割,并单独标记出来。 导

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包