对CNN网络卷积层的一些理解

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/84895233

关于CNN的全连接层可以看这篇文章:https://blog.csdn.net/zgcr654321/article/details/84894860

CNN网络的卷积层的组成和全连接层类似,它也由线性部分和非线性部分组成。但是CNN卷积层的线性部分计算与全连接层不同。

CNN卷积层的线性部分计算总是针对输入样本中局部的一块区域的数据,而全连接层的线性部分计算总是针对输入的整个样本的数据。我们将卷积层的线性部分计算称为卷积。

卷积运算由图像数据和卷积核两部分数据合作完成,图像数据中的每一个和卷积核等大小的区域都会和卷积核完成元素级(Element-wise)乘法(即相同位置的元素相乘),并将乘法得到的结果加和汇聚成一个数字。每个区域都会得到这样的一个数字,所有的数字根据相对位置拼合起来,就是卷积计算最后的结果。

如:

卷积计算的特点:

首先,卷积层的计算只会做某一部分的数据汇总计算,比方说在以某一像素为中心的某个区域内进行汇总计算;

其次,卷积层在完成局部汇总计算后, 会保持计算前的相对位置。如左右相邻的两个像素,以左边像素为中心的汇总结果还是会在以右边像素为中心的汇总结果的左边。这使得卷积层的输入输出及中间结果都保持一定的空间形状。

卷积参数stride:

表示我们卷积区域每次更新时的步长。

卷积参数padding:

在原始图像四周填充适当行和列的0值使得我们卷积输出的矩阵大小不变。padding后,对于那些处于边角的像素也可以参与卷积计算了。

如:

卷积层到底卷积了什么?

卷积运算利用了图像的局部相关性。图像的局部区域的像素往往具有相关性,比如一段笔画附近的像素往往是相同颜色的,一块背景区域的像素之间的颜色差距也不大。

一个像素通常和距离很远的像素关系不大,因此卷积计算在关注了附近像素的同时,忽略了远处的像素,这也和实际图像表现出来的性质类似。

卷积计算就是对我们局部相关的一块区域中的像素数据作了一种“精简”,同时又保留了这一个个局部区域在图像整体上的空间相关性。

卷积只考虑一块局部区域的内容,分析这块局部区域的特点,针对这块局部区域使用卷积算法计算出一个最能代码这块区域的数据特征值。再加上pooling层从卷积结果中只选择一些高价值的信息,这样就可以进一步对特征信息进行过滤处理,让特征变得少而精。

RELU激活函数:

RELU,全称Rectify Linear Unit。它的函数形式是这样的:

def relu(x) :
    return x if x > 0 else 0

函数图像如下:

这个函数主要是为了解决sigmoid激活函数引起的梯度消失问题。

因为sigmoid函数的导数是

而其中f(x)的范围是(0,1)。

这个导数的最大值也只有0.25(f(x)=0.5时)。那么在反向传播计算时,由于是按链式求导法则计算,每层的sigmoid函数的导数都小于等于0.25,这样就会导致最后得到的梯度值在最初的几层变得很小。那么最初几层的参数在训练时更新的速度就很慢,整个网络的训练过程就会延长。

ReLU函数把小于0的部分截断,那么对于x大于0的线性部分的输出,最终的结果就好像左乘一个非0即1的对角阵。

如:

如果把非线性层的输入想象成高维空间的一个向量,那么ReLU就是完成一次向量的投影,舍弃了其中的负数部分。从这个角度来思考,深层神经网络的计算过程就变成了“线性变换一投影一线性变换一投影”这样不断循环的过程。

当然,由于RELU函数在x大于0时输出仍为x,这样数据的上界没有限制,故也可能因为数据过大引起数据不稳定的问题。因此也有人将数据先进行batch normalization后再输入RELU。

relu函数在x大于0时,导数为1,x小于0时导数为0,这样就不会引起梯度消失的问题。对于导数为0的那些权重相当于本次训练过程反向传播时没有更新权重,但是下一次训练时,这个权重接收到的输入x就可能会大于0,这样下一次反向传播时就会更新这个权重。

Softplus激活函数:

它和ReLU的函数非常相近,一般也可以认为是ReLU的平滑版。而且它的导数函数刚好是Sigmoid 函数。

不过这个函数相对来说计算量依然比较大,所以一般不太被人使用。它代表了激活函数的一个新方向:单边抑制,更宽广的接受域(0,+oo),这些和Sigmoid 函数相比有很大的不同。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/84895233
今日推荐