文章目录

  • 1 原理浅析
    • 1.1 背景简介
    • 1.2 标准卷积
    • 1.3 深度可分离卷积
      • 1.3.1 逐通道卷积
      • 1.3.2 逐点卷积
    • 1.4 综合比较
  • 2 代码实现 - pytorch

1 原理浅析

1.1 背景简介

  2017 年 4 月,谷歌提出 MobileNetV1 这一专注于移动设备的轻量级神经网络。MobileNetV1 运用深度可分离卷积(Depthwise separable convolution)构建轻量级网络,在准确率没有大幅下降的情况下,显著降低参数量和计算量,这在实际应用中意义非凡。MobileNetV1 论文相关信息如下:

论文:《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
作者:Andrew G. Howard et al. (谷歌)
年份:2017 年

关于 MobileNetV1 的可用一句话概括,即 MobileNetV1 就是把 VGG 中的标准卷积层替换为深度可分离卷积。因此,本文将对深度可分离卷积进行详细介绍。

1.2 标准卷积

  标准卷积过程如上图所示。因为标准卷积并非本文重点,故而不在此次对其展开讲解。作为下文深度可分离卷积的对照组,按此方式设置标准卷积相关参数:输入为 5 x 5 x 3,卷积核组为 3 x 3 x 3 x 4,padding 为 1,stride 为 1,故而输出为 5 x 5 x 4。在此基础上,计算标准卷积的参数量和计算量:

  • 参数量(卷积核参数量):3 x 3 x 3 x 4 = 108;
  • 计算量(卷积操作计算量):3 x 3 x 3 x 3 x 3 x 4 = 972;

其中,关于参数量的计算可参考本人之前的博客 (神经网络参数量的计算),计算量的计算公式则为计算量 = 卷积核W x 卷积核H x (图片W - 卷积核W + 1) x (图片H - 卷积核H + 1) x 输入通道数 x 输出通道数

1.3 深度可分离卷积

  深度可分离卷积可分为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)两个过程,如上图所示。下面将对这两个过程展开详细的讲解。

1.3.1 逐通道卷积

  逐通道卷积的过程如上图所示,一个卷积核作用于一个通道,因此有卷积核通道数 = 输入通道数 = 输出通道数。此外,也可借助分组卷积进行理解,即逐通道卷积可看作是一个组数为输入通道数的标准卷积,通过设置nn.Conv2d()函数中 groups 参数为输入通道数加以实现。对比标准卷积设置相关参数:输入为 5 x 5 x 3,卷积核组为 3 x 3 x 3,padding 为 1,stride 为 1,故而输出为 5 x 5 x 3。在此基础上,计算其参数量和计算量:

  • 参数量:3 x 3 x 3 = 27;
  • 计算量:3 x 3 x 3 x 3 x 3 = 243;

1.3.2 逐点卷积

  逐点卷积的过程如上图所示,其可被看作是标准卷积的特殊形式,即卷积核尺寸变为 1 x 1 的标准卷积。同样对逐点卷积相关参数进行设置:输入为 5 x 5 x 3,卷积核组为 1 x 1 x 3 x 4,padding 为 0,stride 为 1,故而输出为 5 x 5 x 4。在此基础上,计算其参数量和计算量:

  • 参数量:1 x 1 x 3 x 4 = 12;
  • 计算量:1 x 1 x 5 x 5 x 3 x 4 = 300;

  需要注意的是,为保证在比较标准卷积和深度可分离卷积时的一致性,即保证二者的输入和输出完全一致,标准卷积、逐通道卷积核逐点卷积的padding被设置为 1、1 和 0。

1.4 综合比较

  为直观展示标准卷积与深度可分离卷积在参数量核计算量上的差距,将前文所得结果汇总至下表:

结果对比
卷积操作 参数量 计算量
标准卷积 108 972
深度可分离卷积 逐通道卷积 27 243
逐点卷积 12 300
合计 39 543

由上表可知,在参数量和计算量方面,深度可分离卷积优势巨大。

2 代码实现 - pytorch

# _*_coding:utf-8_*_
import torch
import torch.nn as nnclass DSC(nn.Module):def __init__(self, in_channel, out_channel):super(DSC, self).__init__()self.dsc_module = nn.Sequential(nn.Conv2d(in_channel, in_channel, kernel_size=3, padding=1, groups=in_channel),nn.Conv2d(in_channel, out_channel, kernel_size=1))def forward(self, x):return self.dsc_module(x)if __name__ == "__main__":inputs = torch.rand((8, 3, 5, 5))dsc = DSC(3, 4)outputs = dsc(inputs)# outputs: (B=8, C=4, H=5, W=5)print("Outputs shape: ", outputs.size())

【参考】

  1. B 站视频讲解;
  2. 视频对应笔记;
  3. 深度可分离卷积pytorch实现;

深度可分离卷积解析 - MobileNetV1相关推荐

  1. 深度可分离卷积的Depth,Stack,Channel Multiplier

    通道数目的不同 单通道的卷积 下面的代码测试了仅仅一个属性(depth是1)的深度卷积,其结果和普通卷积是一样的: async function depthwiseConv2dTestSingleDe ...

  2. 可分离卷积及深度可分离卷积详解

    可分离卷积 再来看一下nn.Conv2d(): torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, ...

  3. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能

    [深度学习]利用深度可分离卷积减小计算量及提升网络性能 文章目录 1 深度可分离卷积 2 一个深度可分离卷积层的代码示例(keras) 3 优势与创新3.1 Depthwise 过程3.2 Point ...

  4. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现

    二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...

  5. 2d 蓝图_“蓝图”卷积--对深度可分离卷积的再思考

    论文:Rethinking Depthwise Separable Convolutions: How Intra-Kernel Correlations Lead to Improved Mobil ...

  6. 深度可分离卷积(Xception 与 MobileNet)

    前言 从卷积神经网络登上历史舞台开始,经过不断的改进和优化,卷积早已不是当年的卷积,诞生了分组卷积(Group convolution).空洞卷积(Dilated convolution 或 À tr ...

  7. 【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积?+深度可分离卷积详解

    目录 常规卷积操作 深度可分离卷积 = 逐通道卷积+逐点卷积 1.逐通道卷积 2.逐点卷积 参数对比 介绍 实验 代码清单 一些轻量级的网络,如mobilenet中,会有深度可分离卷积depthwis ...

  8. 深度可分离卷积Depthwise Separable Convolution

    从卷积神经网络登上历史舞台开始,经过不断的改进和优化,卷积早已不是当年的卷积,诞生了分组卷积(Group convolution).空洞卷积(Dilated convolution 或 À trous ...

  9. 深度学习自学(十九):caffe添加深度可分离卷积

    下面是两种不同的深度可分离卷积的实现方式,自己在训练关键点模型,采用MobileNet 添加深度可分离卷积,发现有两种不同的可分离卷积的实现,名字不相同,但是内部都是深度可分离.DepthwiseCo ...

  10. 【CV】MobileNet:使用深度可分离卷积实现用于嵌入式设备的 CNN 架构

    论文名称:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文下载:https:/ ...

最新文章

  1. 阿里取消“361”绩效考核,是打工人的福报吗?
  2. python xlrd处理表格常用方法
  3. 一些常见面试问题背后的逻辑是什么?
  4. golang基本数据类型string字符串常用方法代码示例
  5. 垂直居中相关知识总结
  6. kubernetes V1.10.4 集群部署 (手动生成证书)
  7. 同步、异步的使用场景及好处
  8. 编译原理--中间代码生成(自己看)
  9. 默认select选中其中一个option的值
  10. 【ACL2019】看 NLP 未来发展趋势
  11. SpringData ES中一些底层原理的分析
  12. eclipse3.7.2+KEmulator搭建J2ME开发环境
  13. python一键清屏_在python中将代码清屏的方法
  14. 基于VB.net的电子邮件收发软件设计
  15. dos窗口运行java程序时中文乱码的解决方法
  16. 利用树莓派完成POS58打印机的无驱动打印(初学者)
  17. 二叉树的遍历|前序、中序、后序、层序遍历
  18. 10.认证服务,单点登录
  19. android 锁屏崩溃,去掉锁屏后Android启动死锁问题
  20. Microsemi Libero系列教程(全网首发)

热门文章

  1. 微信小程序登录,后端如何处理?
  2. Spring Boot 应用在 kubernetes 的 sidecar 设计与实战
  3. win10与win7系统之间文件共享
  4. 程序员考证之信息系统项目管理师
  5. 四川自考计算机信息管理专业,计算机信息管理专业2019年10月四川自考科目及考试时间[本科]...
  6. 机器学习(1):knn算法总结
  7. unity导入导出excel的功能
  8. Audition 如何录制电脑内部声音
  9. 我的游戏测试面试过程
  10. 视频监控 ezuikit.js