卷积神经网络原理及其C++/Opencv实现

Posted 萌萌哒程序猴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络原理及其C++/Opencv实现相关的知识,希望对你有一定的参考价值。

在上篇文章中我们主要讲了神经元与卷积神经元的基础知识:


在本文中,我们继续来讲一下池化层、全连接层的基础知识。我们这里所说的全连接层,就是上篇文章中所说的5层网络中的O5层,其实它如果更细分的话,又可以分成Affine层和输出层。


1. 池化层

池化层通常连接在卷积层后面,在卷积神经网络中添加池化层的目的是:在不丢失主要信息的前提下,降低卷积层输出结果的数据量。这样一来,既可以减小运算的复杂度,也可以有效避免过拟合现象(所谓过拟合,即训练神经网络所得到的参数模型,对训练数据的处理表现优良,但是对其它数据的处理则表现不理想的现象)。

常见的池化层方法有均值池化层、最大值池化层,下面我们分别讲述其原理。

假设卷积结果为m行n列的图像,池化窗口为r行c列(m>r,n>c),以下内容我们以4*4的输入图像、2*2的池化窗口为例进行说明。

(1) 均值池化层

对输入图像进行均值池化,相当于使用池化窗口覆盖在输入图像上面从左往右、从上至下地滑动,每滑动到一个位置,计算池化窗口在输入图像上所覆盖区域的像素平均值,作为池化输出。

既然是窗口滑动,就涉及到滑动步长step的选择,step可以取固定的1,2,3...,但是要求满足条件step+c<n且step+r<m,否则左右或者上下滑动一步就超出输入图像的范围了。通常我们默认左右滑动的step=c,上下滑动的step=r,即池化窗口的两个相邻位置没有重叠也没有间隔,本系列文章所讲的池化层,也均如此默认。

对4*4的输入图像进行2*2池化窗口的均值池化,按照默认step,池化窗口左右上下滑动的step均为2,其过程如下图所示:

卷积神经网络原理及其C++/Opencv实现(2)


(1) 最大值池化层

最大值池化操作与均值池化操作大同小异,都是池化窗口在输入图像上从左往右、从上至下的滑动,区别在于:均值池化取池化窗口中的平均值作为池化结果,而最大值池化取池化窗口中的最大值作为池化结果。如下图所示:

卷积神经网络原理及其C++/Opencv实现(2)


2. 全连接层

在这里,我们把全连接层细分为Affine层和输出层来讲。上文说到的5层网络的全连接层如下图所示。

在卷积神经网络中,之所以在最后一层加一层全连接层,而不是卷积层,是为了输出设计者自己想要的数据个数,而Affine层正好可以实现这个需求。对于分类问题,在网络的最后需要输出各个类别的概率,并认为最大概率的类别为最终分类结果,因此在Affine层之后还需要连接一层输出层,把每个类别的输出值转换为0~1之间的概率,转换函数通常使用Softmax函数。

注意:由于全连接层是最后一层,Softmax函数就相当于Affine输出的激活函数,在Affine与Softmax之间不需要另外再加别的激活函数了。

卷积神经网络原理及其C++/Opencv实现(2)

(1) Affine层

全连接层的上一层是池化层,假设池化层的输出为k张r*c的图像,需要把这几张图像按顺序平摊成一维向量,其长度为m=k*r*c:

卷积神经网络原理及其C++/Opencv实现(2)

假设分类问题有n个输出,那么该层有n个神经元,每个神经元的输入都是以上向量X的m个数据。

Affine层的输出按照下式计算,其中0≤i<n,0≤j<m。由此可知,该层有对应的m*n个权重,以及n个偏置。

卷积神经网络原理及其C++/Opencv实现(2)


(2) 输出层

输出层在Affine层之后,主要功能是把Affine层的输出转换为0~1之间的概率值。该功能由Softmax函数实现:

卷积神经网络原理及其C++/Opencv实现(2)

Softmax函数的输出即为神经网络最终的输出。

为了使用梯度下降法调节参数(后面再详细说明),通常使用交叉熵误差函数来衡量Softmax函数的输出值与标签值的差距,其中t为标签值,Y为Softmax函数的输出。

总共有n个输出,每个输出对应一个标签t。对于分类问题,输出的多个结果中,只有一个结果是对应正确解,也只有该结果对应的标签t为1,其它结果对应的标签都是0。比如对于手写数字图像的分类:

0对应的10个标签为:1 0 0 0 0 0 0 0 0 0

1对应的10个标签为:0 1 0 0 0 0 0 0 0 0

2对应的10个标签为:0 0 1 0 0 0 0 0 0 0

3对应的10个标签为:0 0 0 1 0 0 0 0 0 0

4对应的10个标签为:0 0 0 0 1 0 0 0 0 0

.

.

.

9对应的10个标签为:0 0 0 0 0 0 0 0 0 1



本文就讲到这里,下篇文章我们将开始从数据的角度详细推导5层卷积神经网络的前向传播与后向传播。敬请期待!





以上是关于卷积神经网络原理及其C++/Opencv实现的主要内容,如果未能解决你的问题,请参考以下文章

什么是 OpenCV 的最佳卷积神经网络 (CNN) 库? (带有简单的实现和示例)

经典的卷积神经网络及其Pytorch代码实现

毕业设计 - 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

卷积神经网络(原理与代码实现)

卷积神经网络(原理与代码实现)

卷积神经网络CNN原理以及TensorFlow实现