深度学习之:对深度可分离卷积的理解

代码

from keras.layers import *
import numpy as np
import cv2
import matplotlib.pyplot as plt
import os
from keras.models import *
os.chdir("../opencv学习/")
img = cv2.imread("./img.png")[:,:,::-1]
img = cv2.resize(img,(32,32))
plt.imshow(img)

在这里插入图片描述

def cnn():
    inputs = Input(img.shape)
    x = Conv2D(filters=4,kernel_size=(3,3),strides=(1,1),padding="same")(inputs)
    model = Model(inputs,x)
    return model
cnn = cnn()
cnn.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 32, 32, 4)         112       
=================================================================
Total params: 112
Trainable params: 112
Non-trainable params: 0
_________________________________________________________________
def seperatable_cnn():
    inputs = Input(img.shape)
    x = SeparableConv2D(filters=4,kernel_size=(3,3),strides=(1,1),padding="same")(inputs)
    model = Model(inputs,x)
    return model
S_cnn = seperatable_cnn()
S_cnn.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
separable_conv2d_1 (Separabl (None, 32, 32, 4)         43        
=================================================================
Total params: 43
Trainable params: 43
Non-trainable params: 0
_________________________________________________________________

普通卷积如何去做?

卷积核 kernel 和 filters 有什么关系?

卷积核的应用,似乎成为了一个老生常谈的问题,那么卷积核究竟是什么原理,为什么一个 (32,32,3) 的 RGB 图像,通过一个 k e r n e l _ s i z e = ( 3 , 3 ) kernel\_size = (3,3) kernel_size=(3,3), f i l t e r s = 4 filters = 4 filters=4 的 Conv2D layer 完成卷积操作之后会产生 112 个需要计算的参数呢?

在这里插入图片描述

  • 这张图片,首先按照 RGB 三个通道被分解出来
  • 然后进行卷积操作,我们使用了一个 k e r n e l _ s i z e = ( 3 , 3 ) kernel\_size = (3,3) kernel_size=(3,3), f i l t e r s = 4 filters = 4 filters=4 的 convolution layer,也就是说,一个 Conv2D_layer 包含了 4 4 4 个 filters,而每个 filters 内部又包含了 3 3 3 个 kernel

一个 filters 应该包含几个 kernel?

  • 在上面的卷积操作中,一个 f i l t e r s filters filters 应该包含 3 3 3 k e r n e l kernel kernel,这 3 3 3 k e r n e l kernel kernel 将分别对于原图中的 RGB 三个通道进行卷积操作

  • 相当于当我拿到一个 f i l t e r filter filter 我会分别提取 R,G,B 三个通道上的特征,这个 f i l t e r filter filter 将会通过三个带有参数的 k e r n e l kernel kernel 在 R,G,B 三个通道上进行卷积,最后将 R,G,B 三个通道的卷积结果进行叠加和融合,形成了一张特征图。

  • 因此你所看到的结果就是: 1 1 1 f i l t e r filter filter 最后会对应 1 1 1 张特征图,但这 1 1 1 张特征图实际上包含了之前所有通道的部分信息, 4 4 4 f i l t e r s filters filters 会产生最后 4 4 4 张特征图,这些特征图也分别都包含了之前层中所有通道的部分信息。

  • 补充一句,为什么 k e r n e l kernel kernel 叫作卷积核,就是因为,当我们通过卷积层进行卷积操作的时候,最终是通过 k e r n e l kernel kernel 进行每一个 RGB 通道的卷积,而 f i l t e r s filters filters 只是联合了多个卷积核的一个整体概念,通过 f i l t e r filter filter 我们可以综合得到其中多个 k e r n e l kernel kernel 的结果——特征图

如何计算卷积层的参数量?

  • 每个卷积层的参数都来源于卷积核,也就是说,待训练参数的产生是由于卷积核上面的参数需要通过训练来确定最终的值;
  • 基于此,我们计算卷积层的参数量,假设一个图输入是 ( 32 , 32 , 3 ) (32,32,3) (32,32,3) 试图要对他完成一个 k e r n e l _ s i z e = ( 3 , 3 ) kernel\_size = (3,3) kernel_size=(3,3), f i l t e r s = 4 filters = 4 filters=4 的卷积操作,那么根据上面的总结,我们知道,一共使用的卷积核数目是 4 × 3 4×3 4×3 4 4 4 f i l t e r s filters filters 的数量, 3 3 3 是每个 f i l t e r filter filter 中卷积核的数量,因此是 12 12 12 k e r n e l kernel kernel,每个 k e r n e l kernel kernel 9 9 9 个待确定的参数,因此一共需要训练的参数量是 12 ∗ 9 = 108 12 * 9 = 108 129=108 可是我们根据 summary 给出的结果,是 112 112 112 个参数;这多出来的 4 4 4 个参数,是因为有 4 4 4 f i l t e r s filters filters,不是重点,可以忽略,因为卷积层中最主要的参数是来源于卷积核的~

filters 在这些通道上卷积的意义是什么?这些通道间的卷积结果有联系么?

  • 每个 f i l t e r filter filter会通过 k e r n e l kernel kernel 分别在 R,G,B 三个通道上进行特征的提取,然后进行融合得到一个 f e a t u r e feature feature

  • 我们知道每一个 k e r n e l kernel kernel (假设其 size 是 3×3) 都相当于一个特征提取器,当他滑过某个通道的时候,会提取一个 3 × 3 3×3 3×3 的局部特征;当在 R,G,B 上滑动完成,会产生 3 个局部的特征;这三个局部特征最终会进行融合形成一个 f i l t e r filter filter 提取的特征图。

  • 我们拿原图来说,对于 RGB 三个通道,他们之间当然存在联系,因为他们图片的每个像素点都是有三个通道对应像素点叠加而成的,这三个通道之间对应的像素之间都存在关系,因此当我们进行卷积的时候也必须考虑这种通道间的特征关系,

  • 我们在使用 f i l t e r s filters filters 得到特征图的时候需要在每个 f i l t e r filter filter 中对 RGB 通道进行分别卷积,最终再融合是不想丧失原来通道之间的联系。

深度可分离卷积如何去做?

在这里插入图片描述

  • 首先对 RGB 三个通道,每个通道只用一个卷积核卷一遍,得到每个通道的特征图,
  • 然后通过 1 × 1 1×1 1×1 卷积,逐像素地整合这三个通道的信息;有多少个 1 × 1 1×1 1×1 f i l t e r s filters filters 就相当于有多少种方式对来自这 R,G,B 三个通道的特征的逐像素地整合
  • 如果对比普通的卷积和深度可分离卷积,如果都从特征提取和特征整合两个方面去评价,我个人认为:
    • 普通的卷积是在特征提取阶段特别仔细,每个 f i l t e r s filters filters 中都包含了上一层中所有通道的特征提取工作;但是特征融合的时候很随便,直接把多个通道的叠加起来作为一个特征图
    • 深度可分离卷积恰恰因为提取特征的阶段工作很少,对每个通道只提取了一次,所以对特征的整合通过很多个 1 × 1 1×1 1×1 的卷积核来完成。
    • 而之所以深度可分离卷积比普通卷积要差一点,可能就是因为提取的特征不够丰富,而组合的过程却非常精确,但是这样的参数量会极大地下降

深度可分离卷积的参数量

  • R,G,B 三个通道只卷积一次,即只用到了 3 个卷积核,参数量为 3 × 3 × 3 = 27 3×3×3 = 27 3×3×3=27
  • 4 中 1 × 1 1×1 1×1 卷积进行特征整合,参数量为 1 × 1 × 3 × 4 = 12 1×1×3×4 = 12 1×1×3×4=12 12 + 27 = 39 12 + 27 = 39 12+27=39 ,最后的 4 个参数也是因为 f i l t e r s filters filters 的缘故
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值