卷积基础知识
卷积基础知识
卷积神经网络(Convolutional Neural Network,CNN)是深度学习中非常重要的一种神经网络结构,广泛应用于图像识别、语音识别等领域。本文将从卷积的数学概念出发,详细介绍卷积在图像处理和神经网络中的应用,帮助读者深入理解卷积神经网络的工作原理。
一、卷积数学概念
1.1 卷积公式理解
卷积公式如上所示,以下图为例,对这个卷积公式进行理解。其中,f(t)表示随着时间的进食量,g(t)表示随着时间剩余食物的比例。
问题:下午两点肚子里剩余食物?
- 8点吃,到下午两点剩余的食物:f(8)* g(14-8)
- 10点吃,到下午两点剩余的食物:f(10)* g(14-10)
- 12点吃,到下午两点剩余的食物:f(12)* g(14-12)
如果从0点一直吃到14点,x表示当前时刻:
1.2 进阶理解
t时刻发生飓风是由前面时刻蝴蝶扇动翅膀原因造成的,但蝴蝶扇动翅膀对飓风的影响会随着时间减弱,f(t)表示x时刻蝴蝶扇动翅膀对飓风所造成的影响,g(t)时刻表示所剩影响力的比例。求t时刻发生飓风得激烈程度。
而飓风的激烈程度是所有蝴蝶扇动翅膀所造成的影响力的叠加,计算公式如下所示。
总结:卷积公式从另一个角度可以理解成前面时刻的共同作用对此时刻所造成的的影响。
二、卷积在图像中的应用
例如上图为opencv中一个常见的噪声过滤,这个卷积核含义是比较周围像素对当前像素的影响,如果当前像素比周围像素大,那就适当拉低当前像素,如果比周围像素小,那就适当提高当前像素。
三、卷积在神经网络中的应用
3.1 概念
卷积神经网络中的卷积就是把图像中的局部特征挑出来,(对图片进行过滤,把图片中的某些特征提取出来)。33矩阵为卷积核,卷积核在图像上进行卷积操作输出特征图,特征图数值越大,表示当前像素与周围像素组成的33矩阵与卷积核越类似。
计算实例:(-1+1+1+1+1+1+1+1+1)/9=0.77 说明长得不一样,依旧保留了0.77的特征。
卷积核的特点:
- 卷积核的通道数和输入特征图通道数相同
- 输出特征图的个数与卷积核的个数相同
卷积的三层特征:
- 不稳定输入,稳定输出,求系统存量
- 周围像素点对当前像素点产生怎么样的影响
- 过滤器,一个像素点如何试探周围像素点,如何筛选图像的特征。
3.2 普通卷积
self.conv2d = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=4, stride=2, padding=1)
以上图为示例,图中只有一个卷积核,此时输入输出数据为:
- 输入特征图尺寸:WHC,分别对应特征图的宽、高、通道数。
- 单个卷积核尺寸:kkC,分别对应单个卷积核的宽,高,通道数。
- 输出特征图尺寸:W' * H' ,输出通道数等于卷积核数量。
- 参数量:k²C
- 运算量:k²CW'H'
3.3 深度可分离卷积
深度可分离卷积是由PW和DW卷积构成的
- DW卷积特点:卷积核的通道数为1,每一个卷积核对应的输入图像的一个通道(各个通道上的信息没有进行交互)。输入特征矩阵的channel = 卷积核个数 = 输出特征矩阵的channel
- PW卷积特点:卷积核大小为1*1的普通卷积(进行通道信息的交互)
class DepthWiseConv(nn.Module):
def __init__(self,in_channel,out_channel):
super(DepthWiseConv, self).__init__()
# 逐通道卷积 dw卷积
self.depth_conv = nn.Conv2d(in_channels=in_channel,
out_channels=in_channel,
kernel_size=3,
stride=1,
padding=1,
groups=in_channel)
# groups是一个数,当groups=in_channel时,表示做逐通道卷积
# 逐点卷积 pw卷积
self.point_conv = nn.Conv2d(in_channels=in_channel,
out_channels=out_channel,
kernel_size=1,
stride=1,
padding=0,
groups=1)
def forward(self,input):
out = self.depth_conv(input)
out = self.point_conv(out)
return out
3.4 分组卷积
将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成g个feature map。
- 输入特征图尺寸:WHC/g,共有g组。
- 单个卷积核尺寸:kkC/g,分别对应单个卷积核的宽,高,通道数,一个卷积核被分成了g组。
- 输出特征图尺寸:W' * H' * g ,共生成了g个特征图。(以前每个卷积核只生成一个特征图,现在每个卷积核生成g个特征图)
与普通卷积作比较,用同等的参数量和运算量生成了g个特征图。
所以group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息!
从分组卷积的角度来看,分组数g就像一个控制旋钮,最小值是1,此时g=1的卷积就是普通卷积;最大值是输入feature map的通道数C
此时g=c的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积。
class GroupsConv(nn.Module):
def __init__(self,in_channel,out_channel,g):
super(GropsConv, self).__init__()
# 当groups=1时,表示为普通卷积
# 当groups=in_channel时,表示为逐通道卷积
# 当groups在 1 到 in_channel时,表示为分组卷积
self.groups_conv = nn.Conv2d(in_channels=in_channel,
out_channels=in_channel,
kernel_size=3,
stride=1,
padding=1,
groups=g)
3.5 膨胀卷积
3.5.1 膨胀卷积和标准卷积区别
我们先通过下图看一下膨胀卷积和标准卷积的区别,采用的卷积核都是 3×3 的。膨胀卷积有一个超参数 dilation rate,表示卷积核的间隔,标准卷积的 dilation rate 为 1,下图的膨胀卷积 dilation rate 为 2(中间间隔一个像素)。
3.5.2 为什么用膨胀卷积
用CNN进行图像处理时,通常需要经过多次卷积和pooling操作怎大模型的感受野。pooling层可以减少图像的尺寸,再使用卷积核可以增大感受野;多个卷积核堆叠也可以增大感受野。经过卷积核池化的特征图会比较小,这时可以传到全连接网络进行分类。
但是在进行图像分割时,需要对每个像素点进行预测,因此还要把减小的尺寸后的特征图通过上采样方法(反卷积)转回到原始尺寸再进行预测。如下图所示:
这一过程的主要问题:
- 信息丢失,池化操作是不可逆的,通过对特征图进行上采样还原图像尺寸是丢失的信息。
- 无法重构小的物体图像,如果一个物体占4*4像素,则经过四次池化操作之后,物体的信息就无法重构了。
为了避免使用 pooling 等操作扩大感受野,提出了膨胀卷积 (dilated convolution)。膨胀卷积会在卷积的过程中增加一些空洞,略过空洞的点。(后续有时间再具体介绍)