卷积神经网络(Convolutional Neural Networks,CNN )是应用最多、研究最广泛的神经网络之一,卷积神经网络(以下简称CNN )主要用于图像分类、自动智能以CNN实现图像分类为例,图像经过多个卷积层、池化层复合的组件后,实现图像的降维,提取主要特征,最后利用全连接神经网络实现分类,一个完整的CNN识别图像的示意图如下
用一个矩阵替换其中元素的最大值或平均值称为下采样,在CNN中称为数据池化,池化可以有效地实现数据的降维; 相反,从池化结果中恢复数据称为上采样,CNN实现反向传播需要上采样后求参数梯度。 CNN的核心是卷积运算。 卷积运算可以提取图像的不同特征。 当然一个图像的特征有很多。 模型后端的全连接神经网络常常以交叉熵为损失函数,通过交叉熵反馈信息。 CNN可以调整卷积参数,找到最适合分类的特征数据。
一、卷积神经网络前向传播
1.1卷积层
卷积一般根据数据的连续性的有无分为积分和离散两种形式,积分形式:
离散格式:
公式和公式不易对卷积产生感性,一般介绍卷积时以信号处理为例。 下图中的f(t )表示一系列输入信号,自变量t称为时间,g ) t )表示系统响应,下图中的g ) t )表示信号随时间的衰减过程,其中,当t=0时,信号在t=20之后,幅度为f(0)-g ) 20
当想要知道任意时刻信号的输出时,例如在t=10时,信号输出是汇总了t=0、1、2、3.10的各输入信号f(t )和g ) t的作用的值,输出信号out可表示为:
上式对应于式,是离散形式的卷积式。 上式的计算过程可以用下图表示。
上图中变量之间的对应关系有些扭曲,但通常将上图也转换为下图图像会更好。
可以通过卷积操作CNN减小数据的维数:在上述示例中,输入信号f(t )是一个向量,并且通过卷积操作将其合并为一个常数。 如果输入信号即使改变,系统响应函数g ) t )也不改变,则不同信号在与g )卷积后变为一个实数。 作为上图的示例,可以想象如果T=10,则有一个壁并且不同输入信号被卷积之后映射到t=
不同高度的输入信号在g(t )下具有不同的特性,通过卷积实现信号的特性分离。 人工智能算法经常将复杂的数据作为单个实数来处理。 例如,范数使矩阵成为一个实数,内积使两个向量的距离成为一个实数,泛函分析则需要一个线性运算符范数。 当在CNN中处理图像时,信号f(t )可以引申为二维像素值,而f(t )在CNN中被称为卷积核,并且典型的卷积操作如下。
下图是卷积的动态过程。
上面的照片是灰度的,只有黑白两色。 彩色图像由三原色构成。 二维图像为任意像素图素的红、绿、蓝3层结构,分别在0(255 )范围内。 计算机由8位无符号表示,三层彩色图像通常也称为三层通道。 如果输入图像是一张三通道彩色图像,则也可以将其理解为输入图像。这里显示了使用两个卷积内核来卷积三层通道彩色图像的过程,以提取图像的两个特定特征。 由于图像通道数为3,因此每个卷积内核也具有3层结构。
介绍了卷积可以降低维数。 接下来介绍卷积如何提取图像或信号的特征。 图像处理中经常利用二阶导数检测图像的边缘。 二维图像可以被视为二元函数f(x,y ),其中x和y表示像素的行坐标和列坐标,函数值表示该点的像素值。 在图像的边缘,颜色通常会发生交换,表现为函数值的急剧变化。 函数图如下所示。
上图a前半曲线的导数逐渐变大,红圈导数开始变小,同时导数在该点上最大,图b示出像素值导数的变化,最上面的拐点对应于图a的红色标记,再对图b的函数进行导数,原图像的二次导数是下图
根据以上的分析,得到了在图像的边缘二次微分值为0,可以利用该特性检测图像的边缘的结论。 首先生成与原始图像相同大小的纯黑颜色的图表(函数值为0 ),接着计算各点的二次微分值,与黑色像素值相加得到新图像。 用g(x,y )表示新图像的任意一点的像素函数。
g(x,y)=0+2f(x,y)=2f(x,y)
上式中的2f(x,y )表示原图像函数的二次导数,长*宽的二维图像通过张量操作变为1* )长*宽的一维图形矢量,接着可以根据一维图像导出图像的二次导数。 一维图像导数如下。
由此得到二阶导数。
想在f(x 2)和f(x 2 )之间放置一个像素,用f(x 2 )的附近的像素近似计算f(x 2 )的二次导数。 如果将上式的位置参数x2、x 1、x一个个地减少,则得到二次导数近似式(附近的像素的颜色值很相似,所以能够这样近似)。
/strong>
由⑤可得到二维图像的二阶导数:
(5.1)
上式可以写成:
系数为0的4项:f(x-1,y-1)、f(x+1,y-1)、f(x-1,y+1)、f(x+1,y+1)分别代表f(x,y)45°方向的像素,上式代表图像与下面的卷积核做卷积运算:
这个卷积核也称为拉普拉斯算子,根据上面的推导,用一段代码演示利用拉普拉斯算子卷积得到图像边缘的代码。
import osimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Image#转化为灰度图def rgb2gray(rgb): return np.dot(rgb[:,:,:3], [0.299, 0.587, 0.114])def LaplaceConvolution( ): img = Image.open('dataset/grass.jpg') img = np.array(img) grayimg = rgb2gray(img) r, c = grayimg.shape new_image = np.zeros((r, c)) #拉普拉斯算子 L_sunnzi =np.array([[0,1,0],[1,-4,1],[0,1,0]]) for i in range(r-2): for j in range(c-2): #公式5.1:利用拉普拉斯算子做卷积运算 #abs取绝对值模拟Relu函数,可得到非线性输出效果 new_image[i+1, j+1] = abs(np.sum(grayimg[i:i+3, j:j+3] * L_sunnzi)) new_image=np.uint8(new_image) plt.subplot(211) plt.imshow(grayimg, cmap='Greys_r') plt.subplot(212) plt.imshow(new_image, cmap='Greys_r') plt.show()if __name__=='__main__': img=LaplaceConvolution( )卷积前后的图像效果如下:
上面这个例子说明通过卷积可以获得图像的某些特征,CNN会利用多个卷积核来获得图像的多个特征,多个卷积核也称为一组滤波器。上面例子中卷积核是一个矩阵,为什么不叫卷积矩阵呢?'核'是一个立体结构,在CNN中,假设输入特征图高为H,宽度为W,通道数是C;卷积核的高为FH,宽度为FW,卷积核通道数也是C,即卷积核是一个立体结构,由C个权重矩阵复合而成,C个权重矩阵会和输入C个图全部或部分卷积相加后,得到一张通道为1的新的特征图,过程如下图:
卷积需要注意两点:
1) 由于存在激活函数和Dropout机制,有些卷积核权重矩阵并没有被激活,所以卷积核会与上层输入C个图像部分卷积而不是全部。
2) 无论输入图片通道数是多少,卷积后每个特征图通道数都是1,卷积后的每个特征图带有所有或部分上层输入图的特征信息,且输出特征图的个数与卷积核个数相关,有几个卷积核就有几个输出图,称输出特征图的个数为卷积层的通道数、或卷积核的个数,这两个都是一个概念。
当有多个卷积核时卷积层输出图也是一个立体结构,下图卷积层有FN个卷积核,输出图像维度是OW*OH*FN,需要注意的是上层特征图与卷积核卷积后一般会加上一个偏置项,而每个卷积核偏置项都是一样的,即有FN个卷积核同时就有FN个偏置项:
1.2 池化层
池化(pooling)层是将卷积后的特征图进一步降维、缩小特征图尺寸,池化后对信息是虽然有损失的,但也保证了模型有较好的拟合能力,常见池化示意图如下:
常用池化手段有最大池化法(Max pooling)、平均池化法(Average pooling),最大池化法取池化窗口内最大值作为输出,过程如下图所示:
上图最大值池化法池化窗口为2*2,步长为2,平均池化法则取池化窗口内平均值作为输出。需要注意:当使用最大池化法时要同时记下池化窗口内最大值的位置,在反向传播时,最大值处有相应的梯度值,而在非最大值出梯度为0;另外,池化层没有使用激活函数,池化层输入等于输出。
二、卷积神经网络的反向传播
卷积神经网络概念最早在80年代就由日本学者优秀的大雁提出,当时借鉴了动物的视觉皮层命名为neocognitron,早期的卷积神经网络并未引入局部感受野、权值共享、反向传播等理念,导致卷积神经网络在识别率上一度被SVM这类感知机吊打,直到机灵的老师引入现代神经网络技术后CNN才实现了与人类不相上下的识别率,了解CNN反向传播有助于了解其他衍生的卷积神经网络模型如ResNet、GooLeNet、AlexNet等。
CNN与全连接神经网络一样,损失函数的误差在层与层之间传递,在接下来的章节中还会了解到,有些神经网络模型如循环神经网络(RNN),长短时记忆网络(LSTM)不仅有层与层之间的误差传递,还有时间维度上的误差。CNN卷积过程也可以表达成全连接神经网络类似的方式,下图是三个特征图经过两个卷积核滤波的情形,与全连接神经网络区别是下图中连线代表卷积,每个连线上式卷积核中对应的一个权重矩阵:
反向传播时,假设目前层为l,该层的输入为zl,输出为al,两者关系为:al=σ(zl),σ表示为激活函数,CNN在卷积层常用的激活函数是Relu函数,在之前介绍过:Relu(x)=max{0,x},当x大于0时,Relu函数的导数为1。在神经网络的反向传播中,利用链式法则求任意一层的误差时,需要一直定位到该层的输入端,用公式可表达为:
上式中C代表损失函数,在分类问题中常用softmax函数实现的交叉熵作为损失函数,接下来分三种情况讨论CNN的反向传播。
余下文章请转至链接:CNN卷积神经网络详解