尽管神经网络的研究和应用已经取得巨大成功,但在网络的开发设计方面至今仍没有一套完善的理论做指导,应用中采取的主要设计方法是,在充分了解待解决问题的基础上将经验与试探相结合,通过多次改进性试验,最终选出一个较好的设计方案。下面是在开发神经网络中常用的基本方法和实用技术。

(1)  网络信息容量与训练样本数

多层神经网络的分类能力与网络信息容量相关,如果网络的权值和阈值总数nw表征网络信息容量,研究表明,训练样本数N与给定的训练误差ε之间应满足以下匹配关系:

N = nw / ε.

上式表明网络的信息容量与训练样本数之间存在合理匹配关系。在解决实际问题时,训练样本数常常难以满足以上要求。对于确定的样本数,网络参数太少则不足以表达样本中所蕴含的全部规律即发生欠拟合;而网络参数太多,则可能发生过拟合,造成网络的泛化能力减弱。所以,通过上式根据设定的网络结构和误差要求,可以评估一下大致需要多少训练样本。

(2)  训练样本集的准备

训练数据的准备工作是网络设计与训练的基础,数据选择的科学合理性以及数据表示的合理性对于网络设计具有极为重要的影响。数据准备分为原始数据的收集、数据分析、变量选择和数据预处理等诸多步骤。

输入输出量的选择。

一般来讲,输出量代表系统要实现的功能目标,常常是系统的性能指标,分类问题的类别归属,或非线性函数的函数值等。输入量必须选择那些对输出影响大且能检测或提取的变量,此外还要求输入变量之间互不相关或相关性很小。如果对于某个变量是否合适作网络输入没有把握,可分别训练含有和不含有该输入变量的两个网络,对比其效果。从输入、输出量的性质来看,可分为两类:一是数值变量,一类是语言变量。数值变量指的是数值确定的连续量和离散量。而语言变量是用自然语言表示的概念,其“语言值”使用自然语言标识的事物的各个属性,比如颜色、性别、规模等。当选择语言变量作为网络输入或输出时,需将语言值进行编码转变为离散的数值量。

输入量的提取与表示。

通常需要使用信号处理与特征提取技术从原始数据中提取能够反映其特征的若干特征参数作为网络的输入。常见的典型情况有文字符号输入、曲线输入、函数自变量输入和图像输入。字符输入常常根据要识别的字符的特征进行编码之后再作为网络输入;曲线输入通常进行离散化采样,在满足香农采样定理的前提下等间隔采样,也可以根据小波变化或短时傅里叶变换的思想在曲线变化大的地方细分间隔,在曲线平坦的地方放宽间隔;函数自变量输入直接采用待拟合的曲线的自变量作为网络输入;图像输入则很少直接采用像素点的灰度值作为网络输入,通常根据识别的具体目的从图像中提取一些有用的特征参数,再根据这些参数对输入的贡献进行筛选,而这些特征提取则属于图像处理的范畴。

输出量的表示。

0,1或者-1,1表示为二分类;多个有限的离散值表示为多分类;[0,1]之间表示为逻辑回归;连续值表示为拟合。

输入输出数据的预处理。

尺度变换,也叫归一化或标准化(normalization)。进行尺度变换的原因是:网络的输入数据常常具有不同的物理意义和不同量纲,尺度变换为0~1之间使网络训练一开始就给各输入分量以同等重要地位;BP网络的神经元均采用Sigmoid激发函数,变换后可防止输出饱和;Sigmoid激发函数的输出为0~1之间,作为教师信号的输出数据如不进行变换处理,势必使数值大的输出分量绝对误差大,数值小的输出分量绝对误差小,会导致权值调整不均匀。尺度变换是一种线性变换,当样本分布不合理时,线性变换只能统一样本数据的变化范围,而不能改变其分布规律。适合网络训练的样本分布应该比较均匀,相应的样本分布曲线应比较平坦,当样本分布不理想时,最常用是分布变换。比如对数变换或平方根、立方根等。由于变换是非线性的,其结果不仅压缩了数据变化的范围,而且改善了其分布规律。

训练集的设计

训练样本数的确定。一般来说训练样本数越多,训练结果越能正确反映其内在规律,但样本的收集整理往往受到客观条件的限制。此外,当样本数量多到一定程度,网络的精度也很难再提高。实践表明,网络训练所需的样本数取决于输入-输出非线性映射关系的复杂度,映射关系越复杂,样本中含的噪声越大,为保证映射精度所需的样本数越多,而网络规模也越大。因此,可以参考这样一个经验规则,即:训练样本数是网络连接权总数的5~10倍。样本的选择和组织。网络训练中提取的规律蕴含在样本中,因此样本一定要有代表性。样本的选择要注意样本类别的均衡,尽量使得每个类别的数量大致相等。即使是同一类样本也要照顾到样本的多样性和均匀性。按照这种“平均主义”原则选择的样本能使网络在训练时见多识广,而且可以避免网络对样本数量多的类别“印象深”,而对样本数量少的类别“印象浅”。同类样本太集中会使得网络训练时倾向于只建立与其匹配的映射关系,而当另一类别样本集中输入时,权重的调整又转向新的映射关系而将前面的训练结果否定。当各类样本轮流集中输入时,网络的训练会出现振荡使训练时间延长。

(3)  初始权值的设计

网络权值的初始化决定了网络的训练从误差曲面的哪一点开始,因此初始化方法对缩短网络的训练时间至关重要。神经元的变换函数都是关于零点对称的,如果每个节点的净输入均在零点附近,则其输出均处在变换函数的中点。这个位置是其变换最敏感的地方,必然使得网络学习速度快。为了使得各个结点的初始净输入在零点附近,有两种办法可以采用:一是使得初始权值足够小;二是使得初始权值为+1和-1的数量相等。应用中对隐含层权值可采用第一种办法,而对输出层可采用第二种办法。如果输出层权值太小,会使得隐层权值在训练初期的调整量变小,因此采用第二种权值与净输入兼顾的办法。

(4)  神经网络结构设计

神经网络在训练样本问题解决后,网络的输入层结点和输出层结点数便已确定。因此神经网络结构设计主要解决设置几个隐含层和每个隐含层设置几个结点的问题。以下是神经网络的设计者们通过大量实践积累的经验。

隐含层数的设计。

理论证明单隐层的感知器可以映射所有连续函数,只有当学习不连续函数(如锯齿波等)时,才需要两个隐层,所以多层感知器最多需要两个隐层。再设计多层感知器时,一般先考虑设一个隐层,当一个隐层的隐结点数很多仍不能改善网络性能时,才考虑再增加一个隐层。经验表明,采用两个隐层时,如在第一个隐层设置较多的隐结点而第二层设置较少的隐结点,则有利于改善多层前馈网络的性能。此外,对于有些实际问题,采用双隐层所需的隐节点数可能少于单隐层所需的隐节点数。所以,对于隐节点仍不能明显降低训练误差的情况,应当尝试一下增加隐层数。

隐节点数的设计。隐节点的作用是从样本中提取并存储内在规律,每个隐节点有若干权值,而每个权值都是增强网络映射能力的一个参数。隐节点数太少,网络从样本中获取信息的能力就差,不足以概括和体现集中的样本规律;隐节点数太多,可能把样本中非规律性内容如噪声等也学会记劳,从而导致过拟合,造成网络泛化能力减弱。确定最佳隐节点数的一个常用方法是试凑法,可先设置较少的隐节点进行训练,然后逐渐增加隐节点数,用同一个样本集进行训练,从中确定网络误差最小时对应的隐节点数。在用试凑法时,可以用一些确定隐节点数的经验公式。这些公式计算出来的隐节点数只是一种粗略的估计值,可作为试凑法的初始值。其中m为隐层结点数,n为输入层节点数,为输出层节点数,α为1~10之间的常数。

m = sqrt(n+l)+α

m = log2(n)

m = sqrt(nl)

(5)  网络训练与测试

网络设计完成后,要应用设计值进行训练。训练时对所有样本正向运行一轮并反向修改权值一次称为一次训练。在训练过程中反复使用样本集数据,但每一轮最好不要按固定的顺序取数据。通常训练一个网络需要成千上万次。

网络的性能好坏主要看其是否具有很好的泛化能力,而对泛化能力的测试不能用训练数据,而应该用训练数据之外的验证(validation)集。只有训练好的网络在验证集上表现良好才能说明网络训练良好,因此通常是用在验证集上的误差精度来终止训练过程,而不是用训练集上的误差精度。如果网络在训练集上误差非常小,而在验证集上误差却很大,则有可能发生了过拟合。训练次数越多,训练集上误差会越小,而在验证集上误差会先小后增,因此会大致有一个最佳的训练次数。通常在实现中可以判定验证集误差的改变来作为终止训练的标准。比如设定在验证集上,本次训练后的误差要比前一次训练后的误差大20%,就认为前一次训练的结果已经是最佳,则保留前一次训练的网络权值作为训练的结果。

BP神经网络设计常用的基本方法和实用技术的更多相关文章

  1. BP神经网络设计

    1.网络层数 大部分单个隐藏层即可 2.输入层神经元个数 输入变量的个数通常都是由问题的外部描述所确定的.例如,如果有4个外部变量作为网络的输入,那么网络就有4个输入.但是,这是不是意味着输入层的神经 ...

  2. BP神经网络分类器的设计

    1.BP神经网络训练过程论述 BP网络结构有3层:输入层.隐含层.输出层,如图1所示. 图1 三层BP网络结构 3层BP神经网络学习训练过程主要由4部分组成:输入模式顺传播(输入模式由输入层经隐含层向 ...

  3. “程序设计与算法训练”课程设计:“BP神经网络的实现”(C++类封装实现)

    一 题目: 71 BP神经网络的实现: 利用C++语言实现BP神经网络, 并利用BP神经网络解决螨虫分类问题: 蠓虫分类问题:对两种蠓虫(A与B)进行鉴别,依据的资料是触角和翅膀的长度,已知了9支Af ...

  4. NO.2:自学tensorflow之路------BP神经网络编程

    引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...

  5. 模式识别之ocr项目---(模板匹配&BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...

  6. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  7. 神经网络工具箱nntool的使用方法

    关于如何使用nntool神经网络工具箱进行“数据训练”的方法: 1. 在命令窗口键入nntool命令打开神经网络工具箱: 2. 点击Import按钮两次,分别把输入向量和目标输出加入到对应的窗口([I ...

  8. 神经网络中的BP神经网络和贝叶斯

    1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...

  9. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

随机推荐

  1. Qt智能指针QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer

    QPointer (4.0) 已经过时,可以被QWeakPointer所替代,它不是线程安全的. QSharedDataPointer (4.0) -- 提供对数据的COPY-ON-WRITE以及浅拷 ...

  2. 【mysql】知识点

    mysql执行原理 只要是B/S架构,都是会有客户端与服务端,mysql也不例外. 首先客户端发出一个请求,这个请求就是一个查询请求(Select),而它请求的对象就是服务端,服务端是怎么处理这项查询 ...

  3. Java SpringBoot全局错误处理类,返回标准结果

    package demo.utils; import com.alibaba.fastjson.JSON; import demo.controller.ProductController; impo ...

  4. Tkinter 之事件绑定

    import tkinter as tk window = tk.Tk() # 设置窗口大小 winWidth = 600 winHeight = 400 # 获取屏幕分辨率 screenWidth ...

  5. template里面要做数据渲染,但是数据还没有出来

    <el-dialog title="企业详情" :visible.sync="showEditPayment" @close="closeDia ...

  6. argmin ,argmax函数

    在数学中,ARG MAX(或ARGMAX)代表最大值,即给定参数的点集,给定表达式的值达到其最大值: 换一种说法, 是f(x)具有最大值M的x的值的集合.例如,如果f(x)是1- | x |,那么它在 ...

  7. WINDOWS和LINUX相互传文件WINSCP

    WINDOWS和LINUX相互传文件WINSCP 下载并安装WINSCP程序. 左边是WINDOWS文件目录,右边是LINUX目录,选中文件,鼠标拖曳就可以传文件,非常方便.

  8. Oracle查看当前用户所在的表空间

    1.用户 查看当前用户的缺省表空间 select username,default_tablespace from user_users; 1 查看当前用户的角色 select * from user ...

  9. mysql 数据库通过拷贝文件恢复方法

    MyIASM可以直接拷贝过去,就可以完成备份的还原 搭建与原数据库相同的的数据库环境(mysql版本一致) 将data文件夹下的文件复制到搭建的新数据库data文件夹下 删除数据库下的.ibd(数据文 ...

  10. iview3 版本 升级

    Button 废弃 type ghost,原先的 default 样式有改变. Icon 的图标升级至 ionicons 3.0 图标,图标名称有改变. Breadcrumb 废弃 href 属性. ...