Python/torch/深度学习——深度可分离卷积(Depthwise Separable Convolution, DSC)



前言

深度可分离卷积学习记录


一、DSC代码示例

这里以3*3卷积核为例,不改变卷积后的输出尺寸。

import torch
import torch.nn as nn

# 定义深度可分离卷积模块
class DepthwiseSeparableConv(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(DepthwiseSeparableConv, self).__init__()
        # 深度可分离卷积包括深度卷积和逐点卷积两个步骤
        self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1,
                      stride=1, groups=in_channels),
        self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1, padding=0,
                      stride=1),

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)
        return x

二、DSC简单理解

深度可分离卷积(Depthwise Separable Convolution, DSC)包括深度卷积和逐点卷积两个步骤。
其实就是将传统卷积分为两步进行,但是能够大大减少计算量。
计算量公式如下:
F L O P s = C h a n n e l i n × C h a n n e l o u t × W o u t × H o u t × W k × H k / G FLOPs = Channel_in × Channel_out × W_out × H_out × W_k × H_k/G FLOPs=Channelin×Channelout×Wout×Hout×Wk×Hk/G
W o u t = W i n − W k + 1 W_out = W_in - W_k + 1 Wout=WinWk+1
H o u t = H i n − H k + 1 H_out = H_in - H_k + 1 Hout=HinHk+1

C_in 输入通道数
C_out 输出通道数
W_in 输入图像宽度
H_in 输入图像高度
W_out 输出图像宽度
H_out 输出图像高度
W_k 卷积核宽度
H_k 卷积核高度
G 分组数

计算量 = 卷积核W x 卷积核H x (输入W-卷积核W+1) x (输入H-卷积核H+1) x 输入通道数 x 输出通道数
= 输入通道数 x 输出通道数 x 输出图片尺寸(宽 x 高) x 卷积尺寸(宽 x 高)

深度卷积(空间卷积)

与传统卷积基本相同,区别在于多了 groups=in_channels ,以及 out_channels = in_channels。

  • groups = in_channels
    即将每个通道对应使用一个卷积核,利用分组卷积的方式来实现。
  • out_channels = in_channels
    即输出通道数=输入通道数,因此在执行深度卷积时不改变通道数,只关注权重变化。

逐点卷积(通道卷积)

使用 kernel_size = 1 的卷积核进行卷积时,计算公式与3*3的卷积核类似,也都是相乘再加和,主要用于修改通道数通道数。
在这里逐点卷积就是用 kernel_size = 1 的卷积核实现DSC中的通道数修改。

点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐