首页 > 编程知识 正文

图神经网络内部结构,卷积神经网络计算过程

时间:2023-05-03 05:24:34 阅读:13545 作者:3941

卷积神经网络(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卷积神经网络详解

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。