【深度学习】讲一个深度分离卷积结构和空洞卷积的应用
文章目录 前言:看一张图像 1 概述 1.1 正常卷积 1.2 Depth可分离卷积 2 深度可分离卷积的优点 3 空洞(扩张)卷积(Dilated/Atrous Convolution) 4 构建模型 5 U-Net网络更换空洞卷积 前言:看一张图像
shape:
下图为卷积后的特征图(feature map),左边为卷积核对输入图片左上放进行卷积时的示意图。
单通道单卷积核

单通道多卷积
右边为Feature map。 卷积核长下面这样。
多通道单卷积核
左边为包含有三个通道的输入,右边为一个卷积核和一个偏置。注意,强调一下右边的仅仅只是一个卷积核,不是三个。笔者看到不少人在这个地方都会搞错。因为输入是三个通道,所以在进行卷积的时候,对应的每一个卷积核都必须要有三个通道才能进行卷积。下面我们就来看看具体的计算过程。

多通道多卷积核
左边依旧为输入矩阵,我们现在要用右边所示的两个卷积核对其进行卷积处理。对于第二个卷积核,都是将每个通道上的卷积结果进行相加,最后再加上偏置。形状为[3,3,2]的卷积特征图。
可以理解为一个卷积核一般输出一个featuremap。
深度可分离卷积网络与普通卷积网络 深度可分离卷积神经网络是卷积神经网络的一个变种,可以对卷积神经网络进行替代。对于普通的卷积申请网络,如下图左边部分所示,由卷积层,批归一化操作与激活函数构成的。对于深度可分离卷积网络,它是由一个3×3深度可分离的卷积层,批归一化,激活函数,1×1普通卷积层,批归一化,激活函数构成。在卷积神经网络中,将下图左边部分替换为右边部门,那么卷积神经网络就成为了深度可分离卷积网络。
对于普通的卷积神经网络,输出通道是和所有的输入通道有关的。在深度可分离卷积网络里,输出通道只与单个输入通道有关。
1.1 正常卷积
原始图像是二维的,大小是12×12。由于是RGB格式的,所以有三个通道,这相当于是一个3维的图片。其输入图片格式是:12x12x3。滤波器窗口大小是5x5x3。这样的话,得到的输出图像大小是8x8x1。
这仅仅提取到的图片里面的一个属性。如果希望获取图片更多的属性,譬如要提取256个属性,则:

1.2 Depth可分离卷积
深度可分离卷积的方法有所不同。正常卷积核是对3个通道同时做卷积。也就是说,3个通道,在一次卷积后,输出一个数。深度可分离卷积分为两步,第一步是用三个卷积对三个通道分别做卷积,这样在一次卷积后,输出3个通道的属性值
第二步是用卷积核1x1x3对三个通道再次做卷积,这个时候的输出就和正常卷积一样,是8x8x1:
如果要提取更多的属性,则需要设计更多的1x1x3卷积核心就可以
因为深度可分离神经网络的输出通道只与单个输入通道有关,所以很大程度上降低了参数计算量

可以看出运用深度可分离卷积比普通卷积减少了所需要的参数。重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道。实现了通道和区域的分离。
3 空洞(扩张)卷积(Dilated/Atrous Convolution)空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3×3的卷积核,在相同参数量和计算量下拥有5×5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,【正常的convolution 的 dilatation rate为 1】。
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。 在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。
模型利用keras自带的keras.layers.SeparableConv2D来实现,模型的结构与TensorFlow2.0(九)–Keras实现基础卷积神经网络中的结构一样,只是用深度可分离卷积代替了普通卷积:
# tf.keras.models.Sequential()用于将各个层连接起来 model = keras.models.Sequential() # 第一层卷积层 model.add(keras.layers.SeparableConv2D(filters = 32, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu, # 激活函数relu input_shape = (28, 28, 1))) # 输入维度是1通道的28*28 # 第二层卷积层 model.add(keras.layers.SeparableConv2D(filters = 32, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu)) # 激活函数relu # 最大池化层 model.add(keras.layers.MaxPool2D(pool_size=2)) # 第三层卷积层 model.add(keras.layers.SeparableConv2D(filters = 64, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu)) # 激活函数relu # 第四层卷积层 model.add(keras.layers.SeparableConv2D(filters = 64, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu)) # 激活函数relu # 最大池化层 model.add(keras.layers.MaxPool2D(pool_size = 2)) # 第五层卷积层 model.add(keras.layers.SeparableConv2D(filters=128, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu)) # 激活函数relu # 第六层卷积层 model.add(keras.layers.SeparableConv2D(filters=128, # 卷积核数量 kernel_size = 3, # 卷积核尺寸 padding = same, # padding补齐,让卷积之前与之后的大小相同 activation = relu)) # 激活函数relu # 最大池化层 model.add(keras.layers.MaxPool2D(pool_size = 2)) # 全连接层 model.add(keras.layers.Flatten()) # 展平输出 model.add(keras.layers.Dense(128, activation = relu)) model.add(keras.layers.Dense(10, activation = “softmax”)) # 输出为 10的全连接层空洞卷积(Dilated/Atrous Convolution)主要是在第四层和第五层实现的。
处理前:
处理后:
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:【深度学习】讲一个深度分离卷积结构和空洞卷积的应用 https://www.yhzz.com.cn/a/12473.html