
Python/torch/深度学习——深度可分离卷积(Depthwise Separable Convolution, DSC)
深度可分离卷积学习记录。
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=Win−Wk+1
H
o
u
t
=
H
i
n
−
H
k
+
1
H_out = H_in - H_k + 1
Hout=Hin−Hk+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中的通道数修改。
更多推荐
所有评论(0)