您的位置:首页 > 编程语言 > MATLAB

[置顶] ANN梳理-数字图像处理与机器视觉_visual c++与Matlab实现学习笔记

2018-02-05 15:34 399 查看
【前言】

 在图像分类领域有两个很实用的技术:人工神经网络(ANN-Artificial Neural Networks)和支持向量机(SVM-SupportVector Mechine),近期在学习的过程中梳理了ANN的一些基础知识,以便实际应用中更为清楚其理论和一些参数的设置。

  首先从个人理解的角度简述一下ANN,我们都知道人工神经网络属于模仿人类对物体的识别机制创建的,简单的说:人类之所以可以识别物体,是因为人类不同的神经元对不同的形状、特征比较敏感,人对一个物体整体的识别可以进一步分解为各个神经元对不同特征的识别的总和,利用这个原理,我们可以搭建一个类似于神经网络的系统,将输入的一整幅图拆分为各个局部图,并最终叠加,得到分类结果。在这个过程中我们搭建了神经网络,引入一个比较重要的参数-权值(稍后会具体讲),ANN中本身有很多权值,但是太多的数值增加其处理的复杂度,因此ANN有一个简化的机制:权值共享,即各个神经元共享一组权值,权值对识别的准确度非常重要,我们知道现在的ANN分类中需要大量的训练样本和测试样本,为什么?主要是用大量训练数据不断修正所搭建系统中的权值,使得我们的权值进行识别时的误差降低到最小(误差也是重要的概念,后文会讲),以上,就将ANN具体过程简化为两部分内容:1)搭建模型;2)样本数据不断修正权值。

 【注】该篇为学习【数字图像处理与机器视觉_visualc++与Matlab】一书时整理的学习笔记。

1. 线性基础

1)感知器

         感知器属于只输出-1、1两种情况的简单人工神经元,输入与各自权值的加权和。



注:图自:数字图像处理与机器视觉_visual c++与Matlab实现(侵删)

2)线性单元

         比感知器更复杂一些,输出不局限与两种结果。

2. 误差准则

         误差为以下公式,之所以有1/2是为了在求导时冲抵掉平方的2。知道了误差,我们可以将权值简化为二维数据(W0,W1),这两个值和误差构成的三维关系就
4000
是一个抛物面,误差取最小值时的权值即为最优值,即我们设置的参数能让输出的误差降到最低。实质上训练就是这个寻找最优权值的过程。因而引入一种很重要的方式“梯度下降法”,我们知道梯度是方向导数最大的方向,通过梯度,我们找到曲面上往最小值方向下降最快的值,对原始权值不断进行修正。(此处涉及求导)





到目前是线性的情况,较为简单,但是实际情况中往往是非线性的,因而引入多层人工神经网络(非线性曲面-超抛物面);

3. ANN

         相比以上简单的神经元,增加了激活函数(非线性),以下神经元又可进一步构成复杂的ANN,即输入层、隐藏层和输出层三层结构,隐藏层可能有多个神经元,相邻层之间为全连接。在复杂的结构中,仍然是求最优权值的过程,因此有“BP反向传播算法”,其实是基于梯度下降算法,用于得到最优的权值,使得系统输出的误差降低到最小。



具体训练步骤:

梯度下降算法:

1)随机给权值初值(-0.05-0.05);

2)求输出(加权和);

3)求权值修正量;

4)更新权值;

5)重复以上。

 

BP算法:

1)创建包含隐藏层的网络,给权值随机赋值(-0.05-0.05);

2)输入一个样本数据向量,求输出;

3)求平方误差和权值修正量;

4)更新权值;

5)重复以上。

 

注:1)为什么是-0.05-0.05?

         为了降低搜索停留在一个局部最小值的概率,尽可能得到全局的最小值。激活函数是一个递增,平缓的函数,在输入为0附近值时,最接近线性状态,可避免局部最小值。

 

         2)何时停止训练?

         几种方式:1. 迭代次数达到某个值时停止;2.误差降低到阈值以下时;3. 测试样本集上分类误差符合某个标准时。

 

4. 实际应用

         数字图像处理与机器视觉_visualc++与Matlab实现中提供了两个应用,一个是ANN的数字识别,一个是SVM的人脸识别,都是用C++实现,可以通过这两个实例比较完整的了解两种分类方式的具体原理和要点,虽然比较繁琐,没有用到主流框架,但是很适合入门学习。

 以下根据实际工程及自己的理解简单梳理一下整体步骤,实际代码资料网上可以下载该书的源码,我这边会根据自己的理解做一个类似功能的仿照分类工程,后期也会上传。

对于ANN数字识别,有以下几个要点:

1)数据集

         训练/测试数据集,该书例程中直接以二值化图像(64*32)作为样本,免去了图像预处理的部分,实际使用中还是需要预处理,但是也就是常见的那些方式。

2)输入

         以全部像素作为输入。之前的学习笔记(链接点击打开链接)中整理过,深度学习和机器学习的一个区别在于“特征工程”,ML中往往对特征提取比较看重,输入为特征向量,而DL中常以全部像素作输入,增大自由度,免去特征提取的工作量。

3)重采样

         以全部像素作输入,则有64*32=2048个输入,增加复杂度,权值太多,以步长(4)进行重采样,则有128个权值。

4)归一化

         此处输入就是二值图,不需要归一化。

5)输出

         以[0.1,0.1,0.1,0.1,0.9,0.1,0.1,0.1,0.1,0.1],此处表示输出识别结果为“4”,不用0/1整数是因为激活函数的输出为【0,1】。

6)确定隐藏层数目和神经元数目

         常见为1个隐藏层,也有2个的情况,但是太多层训练时间增长,过多神经元数目可能导致过拟合,反而使精度下降。

7)其他参数:

学习率-一般比较小,梯度下降算法时取0.3;增量梯度下降为0.1或0.05.

冲量项:没有经验值,根据具体实验确定。

以上为构建ANN和训练时的重要参数,在实际工程中主要分为三个部分:1)构建网络;2)BP算法实现;3)训练数据载入。在c++中实现时,将神经元、神经网络层都定义为结构体。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: