bp神经网络的激活函数算法为什么要用激活函数

闲谈神经网络--写给初学者(二)
时间: 00:09:47
&&&& 阅读:1364
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&继续上篇来写。为了使这个神经网络满足我们需要,我们能够改变的东西有:
(0)输入输出的格式和质量
(1)各个神经元的权重值W
(2)偏置bias,这个改变从广义上说,也算是改变权重W0
(3)激活函数
(4)神经网络层数
(5)每一层神经元个数
(6)神经网络的结构
那么问题又来了,这些参数怎么改变呢?我们一部分一部分的进行讲解。
一、激活函数的选取
下面列出几个激活函数数学定义以及Matlab中的相应函数,大家可以在matlab中用函数画一下,看看他们到底是怎么一个函数。
(1)&线性函数&( Liner Function )
Matlab中可以使用:purelin函数
(2)&阈值函数&( Threshold Function )
Matlab中可以使用:hardlim和hardlims函数,值域分别为[0,1]和[-1,1]
(3) S形函数&( Sigmoid Function )
Matlab中可以使用:logsig函数
(4)&双极S形函数&
Matlab中可以使用:tansig函数
  上面列出了几个激活函数,当然还可以选择其他的激活函数,那么到底怎么选择呢?目前我看到的是:就是使用Matlab默认的,或者瞎试,哪个好用哪个。不过我觉得,等对神经网络理解比较透彻了,应该对如何选择会有更深入的认识。
二、各个神经元的权重值W和偏置bias
  我们输入网络数据,再输出数据,就是为了改变W和bias,使网络更符合要求,对于如何修改W和bias,是借助于一定的训练算法和学习算法来完成的。这些训练算法和学习算法,对应于Matlab中就是一些训练函数和学习函数。注意:训练用英文train来表示,学习用learn来表示。
&  接下来问题是:这些算法是依据什么原理设计的呢?总结下来有下面两种训练算法:有监督学习算法和无监督学习算法。
1.有监督学习算法,也叫有教师学习算法等等,但是记住英文名就可以了:Supervised Learning,简单来说就是:我们输入许多数据,经过神经网络后会有输入数据,根据这个输出数据和期望的输出数据的差值大小,进而来调整权重和bias。有下面两点注意:
(1)期望输出哪里来的?其实我们用一些数据来训练网络,那么肯定得有输入输出数据,这个输出就是我们的期望输出数据,而网络的输出就是实际输出,随着不停的调整权重和bias,这个差值会越来越小。例如输出大于期望,那么就可以减小权重,或者使bias更负一些等等。
(2)初始权重和bias如何选择?默认是随机分配的,因此对于我们创建的神经网络,每一次训练运行,结果都会不同的,就是因为初始权重和bias是随机的。想保存最好的一次状态,可以save filename net来进行保存。
2.无监督学习算法,也叫无教师学习算法等等,但是记住英文名就可以了:UnSupervised Learning,大概思想是:当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。具体不再详细讲解。
上面讲了理论,在Matlab中,训练算法有:
(1)traingdx(梯度下降动量法),
(2)trainlm(Levenberg-Marquadt反传算法),其中BP网络默认是这个函数& &
(3)traingd(普通的梯度下降法)
(4)trainbfg
(5)trainrp
为什么会有这么多算法呢?你想啊,我们学习编程过程中,连一个排序,就有好多好多算法,所以这里神奇的神经网络有这么多算法,也不奇怪了。
补充一点:很多人问,train和learn到底有什么区别呢?可以看下面的回答:
简单来说,就是train是全局的调整权重和bias,而learn是调整局部的神经元的权重和bias。
三、神经网络层数、每一层神经元个数、神经网络的结构
  简单来说就是选择不同的网络,如BP,RBF、Hopfield等网络,有机会在介绍这些具体的网络时,可以深入的讲一讲。
四、输入输出的格式和质量
1.输入输出数据的质量:保证输入数据准确完整等等就行,这里不做深入讲解,具体可以看看数据预处理。
2.输入输出数据的格式:这里涉及到的就是数据的归一化问题,这里简单说一下。
  输入输出数据的归一化简单来说:就是利用一定的算法,把输入输出数据归一到[0,1]区间或者[-1,1]之间,原因如下:
(1)输入输出数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。例如有些输入数值是高度,而有些是温度,纯数字大小很差别很大。
(2)数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
(3)由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
(4)S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067。
  知道了为什么要归一化,那么如何进行归一化呢?两个公式
(1)y = ( x - min )/( max - min ),那么数据x就化简到[0,1]之间了。
(2)y = 2 * ( x - min ) / ( max - min ) - 1,那么数据x就化简到[-1,1]之间了。
  知道了数学上的公式,那么在Matlab中如何使用呢?
 使用一个统一的公式:mapminmax,具体用法:
(1)[Y,settings]=mapminmax(a);默认把a的值映射到[-1,1]中,返回值给Y,settings保存一些设置的信息,使用的公式是:y = 2 * ( x - min ) / ( max - min ) - 1
(2)settings.ymin=0;化成[0,1]范围,需要提前设置setting的属性,计算公式:y = ( x - min )/( max - min )
& & & & mapminmax(x,settings)%传入两个参数
(3)mapminmax(‘reverse‘,Y,settings)%将原来归一化后的数据再反回去,之所以可以反回去,是因为传入了settings参数,而这个参数里面保存有反之前的数据,如最大值,最小值等等。
&  &我们可以改变的参数以及里面一些东西讲完了,先写这么多,下一篇给大家写一个例子,会通过BP网络的一个例子,看看到底怎么使用,再加深一下印象吧。看累了就顺便扫扫下面邪恶的广告,觉得不错可以帮帮告诉一下朋友,有啥好想法也可以给我留言,我也转告美女,不早了,睡觉吧。
============================
最近帮朋友弄了微信公众号,每天早上6点30分,发送一个60秒的语音,有兴趣的朋友不妨关注一下。
微信号:歪理邪说(wailixs)
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!深度学习(1)
神经网络中激活函数的作用
神经网络中的激活函数的真正功能是什么?请在 kdnuggets 阅读这篇概述文章(What is the Role of the Activation Function in a Neural Network?)并查看下最下面的速查表吧。本文作者是来自密歇根州立大学的 Sebastian Raschka,她是《Python Machine Learning》一书的作者。
尽管看起来似乎会太过琐碎,但我还是想先从「 最初的地方」开始:线性回归(Linear regression)。
(常规的最小二乘法)线性回归的目的是找到最优权重——与输入线性组合——可得出一个能够最小化目标与解释变量之间垂直偏移的模型,但是在此我们并不会讨论模型拟合,因为这是另一个话题。
因此,在线性回归中,我们会计算权重与输入的线性组合(让我们把这个函数称为「净输入函数(net input function)」)。
net(x)=b x1w1 x2w2 ...xnwn = z
接下来,我们来讲逻辑回归(logistic regression)。我们让净输入量 z 通过一个非线性「激活函数(activation function)」——即逻辑 S 型函数(logistic sigmoid function)。
把它想象成线性的净输入量被「挤压」入一个拥有良好特性的非线性方程,可以返回条件概率 P(y=1 | x)(即样本 x 隶属于类别 1 的概率)。现在,如果我们添加一个阶跃函数,例如:
如果 S 型函数输出大于或等于 0.5 预测为类别 1,反之为类别 0;
(等价于:当净输入 z 大于等于 0 → 预测为类别 1,反之为类别 0。)
这样就可以得到如图所示的逻辑回归分类器:
但逻辑回归(一种泛化的线性模型)其决策面(decision surface)是线性的,从这个层面上来看它仍然是一种线性分类器:
如果数据类别可以线性划分,逻辑回归分类器对此可以工作的很好,但我们考虑一个棘手的例子:
数据类别非线性可分。对于此处这个例子,一个非线性的分类器可能会是更好的选择,如一个多层神经网络。接下来,我训练了一个简单的多层感知器,其有一个包含 200 个这种逻辑 S 型激活函数的隐藏层。让我们从下图看一下现在决策面看起来是怎样的:
(注意这里我可能有点过拟合(overfitting ),但过拟合是另外的一个话题)
全连接的前馈神经网络,看起来基本如下图这样:
在这个特例中,我们的输入层只有 3 个单元(分别为 x0 = 1 作为偏置单元, x1 和 x2 作为两个特征);隐藏层有 200 个这样的 S 型激活函数 (am),而输出层有一个 S 型函数。其之后被送入一个单位阶跃函数(图中没有展示)产生预测的输出类别标签 y^。
总结一下,逻辑回归分类器有一个非线性激活函数,但是该模型的权重系数本质上是一个线性组合,也因此逻辑回归是一个泛化的线性模型。现在可以得到,激活函数在神经网络中的功能即通过对加权的输入进行非线性组合产生非线性决策边界(non-linear decision boundary)。
(如果你们感兴趣,更多可参考 Sebastian Raschka 在 Quora 上对「后向传播算法对于神经网络最好的可视化解译是什么?(What is the best visual explanation for the back propagation algorithm for neural networks?)」的回答并查看这种情况下的权重学习。)
为了大家方便,我增加了最常用的激活函数列表如下:
本文转自:http://bbs.tiexue.net/post_.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7155次
排名:千里之外
(1)(1)(2)(1)(4)(2)我的图书馆
本文的目的是学习和掌握BP神经网络的原理及其学习算法。在MATLAB平台上编程构造一个3-3-1型的singmoid人工神经网络,并使用随机反向传播算法和成批反向传播算法来训练这个网络,这里设置不同的初始权值,研究算法的学习曲线和训练误差。有了以上的理论基础,最后将构造并训练一个3-3-4型的神经网络来分类4个等概率的三维数据集合。一、技术论述1.神经网络简述神经网络是一种可以适应复杂模型的非常灵活的启发式的统计模式识别技术。而反向传播算法是多层神经网络有监督训练中最简单也最一般的方法之一,它是线性LMS算法的自然延伸。网络基本的学习方法是从一个未训练网络开始,向输入层提供一个训练模式,再通过网络传递信号,并决定输出层的输出值。此处的这些输出都与目标值进行比较;任一差值对应一误差。该误差或准则函数是权值的某种标量函数,它在网络输出与期望输出匹配时达到最小。权值向着减小误差值的方向调整。一个BP神经网络的基本结构如下图所示,图中Wji,Wkj是需要学习的权值矩阵:2.三层BP神经网络一个三层神经网络是由一个输入层、一个隐含层和一个输出层组成,他们由可修正的权值互连。在这基础上构建的3-3-1神经网络,是由三个输入层、三个隐含层和一个输出层组成。隐含层单元对它的各个输入进行加权求和运算而形成标量的“净激活”。也就是说,净激活是输入信号与隐含层权值的内积。通常可把净激活写成:其中x为增广输入特征向量(附加一个特征值x0=1),w为权向量(附加一个值W0)。由上面的图可知,这里的下标i是输入层单元的索引值,j是隐含层单元的索引。Wji表示输入层单元i到隐含层单元j的权值。为了跟神经生物学作类比,这种权或连接被称为“突触”,连接的值叫“突触权”。每一个隐含层单元激发出一个输出分量,这个分量是净激活net的非线性函数f(net),即:这里需要重点认识激活函数的作用。激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数:(a)线性函数 ( Liner Function )(b) 阈值函数 ( Threshold Function )以上激活函数都属于线性函数,下面是两个常用的非线性激活函数:(c)S形函数 ( Sigmoid Function )(d) 双极S形函数S形函数与双极S形函数的图像如下:由于S形函数与双极S形函数都是可导的,因此适合用在BP神经网络中。(BP算法要求激活函数可导)介绍完激活函数,类似的,每个输出单元在隐含层单元信号的基础上,使用类似的方法就可以算出它的净激活如下:同理,这里的下标k是输出层单元的索引值,nH表示隐含层单元的数目,这里把偏置单元等价于一个输入恒为y0=1的隐含层单元。将输出单元记为zk,这样输出单元对net的非线性函数写为:综合以上公式,显然输出zk可以看成是输入特征向量x的函数。当有c个输出单元时,可以这样来考虑此网络:计算c个判别函数,并通过使判别函数最大来将输入信号分类。在只有两种类别的情况下,一般只采用单个输出单元,而用输出值z的符号来标识一个输入模式。3.网络学习反向传播算法(BP算法)由两部分组成:信息的正向传递与误差的反向传播。在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,第一层神经元的状态只影响下一层神经元的状态。如果输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望目标。神经网络的学习方法正是依赖以上两个步骤,对于单个模式的学习规则,考虑一个模式的训练误差,先定义为输出端的期望输出值tk(由教师信号给出)和实际输出值zk的差的平方和:定义目标函数:其中t和z是长度为c的目标向量和网络输出向量;w表示神经网络里的所有权值。反向传播算法学习规则是基于梯度下降算法的。权值首先被初始化为随机值,然后向误差减小的方向调整:其中η是学习率,表示权值的相对变化尺度。反向传播算法在第m次迭代时的权向量更新公式可写为:其中m是特定模式的索引。由于误差并不是明显决定于Wjk,这里需要使用链式微分法则:其中单元k的敏感度定义为:又有:综上所述,隐含层到输出层的权值更新为:输入层到隐含层的权值学习规则更微妙。再运用链式法则计算:其中:可以用上式来定义隐单元的敏感度:因此,输入层到隐含层的权值的学习规则就是:4.训练协议反向传播的随机协议和成批协议如下步骤所示:在成批训练中,所有的训练模式都先提供一次,然后将对应的权值更新相加,只有这时网络里的实际权值才开始更新。这个过程将一直迭代知道某停止准则满足。二、自编函数实现BP网络以下简单编写了一个3-3-1三层BP神经网络的构建与两种训练方法(写得比较杂乱),以下是基本步骤:1.构造 3-3-1 型的sigmoid 网络,用以下表格中的w1和w2类的数据进行训练,并对新模式进行分类。利用随机反向传播(算法1),学习率η=0.1,以及sigmoid函数,其中a=1.716,b =2/3,作为其隐单元和输出单元的激活函数。2.构造三层神经网络,参数包括:输入层、中间层、输出层神经元向量,以及输入层到中间层的权值矩阵,中间层到输出层的权值矩阵,中间层神经元的偏置向量,输出层神经元的偏置向量等。其实质是定义上述变量的一维和二维数组。3.编写函数[net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb),实现BP网络的前馈输出。为了便于后续的学习算法的实现,该函数的输出变量包含:第j个隐单元对各输入的净激活net_j;第k个输出单元对各输入的净激活net_k;网络中隐藏层的输出y和输出单元的输出向量z。4.编写函数,实现BP网络的权值修正。其中,神经元函数,及其导数可参考:神经元函数:神经元函数导数:5.编写函数[NewWxy, NewWyz, NewWyb, NewWzb, J] = train(x, t, Wxy, Wyz, Wyb, Wzb),实现算法1和2所述的BP网络的训练算法,输出各权向量的变化量和当前目标函数值J。
function [net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb)
a = 1.716;
net_j = Wxy * x' + W
y = 3.432 ./ (1 + exp(-1.333 * net_j)) - 1.716;
net_k = Wyz' * y + W
z = 3.432 ./ (1 + exp(-1.333 * net_k)) - 1.716;123456789101112131415161718192021222324
[NewWxy, NewWyz, NewWyb, NewWzb, J] = train(x, t, Wxy, Wyz, Wyb, Wzb)
Eta = 0.01;
a = 1.716;
[net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb);
J = power(norm((t - z),2), 2) / 2;
Error_yz = (t - z) .* (a * b - b / a * z .* z);
Error_xy = Wyz * Error_yz .*
(a * b - b / a * y .* y);
delta_Wyz = Eta * y * Error_yz';
delta_Wxy = Eta * Error_xy *
NewWxy = Wxy + delta_W
NewWyz = Wyz + delta_W
NewWyb = Wyb + Eta * Error_
NewWzb = Wzb + Eta * Error_12345678910111213141516171819202122232425262728293031323334353637383940function
[delta_Wxy, delta_Wyz, Error_xy, Error_yz, J] = BatchTrain(x, t, Wxy, Wyz, Wyb, Wzb)
Eta = 0.01;
a = 1.716;
[net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb);
J = 1 / 2 * power(norm(t - z), 2);
Error_yz = (t - z) .* (a * b - b / a * z .* z);
Error_xy = Wyz * Error_yz .* (a * b - b / a * y .* y);
delta_Wyz = Eta * Error_yz * y';
delta_Wxy = Eta * Error_xy *123456789101112131415161718%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % BP神经网络实验
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 训练样本(3类)
w1 = [ 1.58
2.32 -5.8 ;...
1.58 -4.78;...
1.01 -3.63;...
2.18 -0.39;...
1.21 -4.73;...
1.40 -1.89;...
1.44 -3.22;...
1.33 -4.38;...
0.84 -1.96];
w2 = [ 0.21
0.03 -2.21;...
0.28 -1.8 ;...
0.93 -1.01;...
0.39 -0.39;...
0.96 -1.16;...
1.94 -0.48;...
0.72 -0.17;...
1.31 -0.14;...
w3 = [-1.54
3.45 -1.33;...
1.79 -0.87;...
3.51 -0.22 -1.39;...
1.40 -0.44
0.68 -0.99;...
-0.66 -0.45
% 初始化权值(随机初始化)
Wxy = rand(3,3) * 2 - 1;
Wyz = rand(3,1) * 2 - 1;
Wyb = rand(3,1) * 2 - 1;
Wzb = rand() * 2 - 1;
w = [w1; w2];
T = [1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1];
% 教师向量
% 以下是随机反向传播算法
delta_J = 0.001;
J(time) = 2 * delta_J;
% 只是让迭代开始,没什么作用
detJ = 2 * delta_J;
while time & 10000%detJ & delta_J
num = ceil(rand(1) * 20); % 选择产生一个1到20之间的随机数
x = w(num, :);
% 任取w中一个模式
t = T(num);
time = time + 1; % 计算迭代次数
[NewWxy, NewWyz, NewWyb, NewWzb, J(time)] = train(x, t, Wxy, Wyz, Wyb, Wzb);
% 更新权值
Wxy = NewW
Wyz = NewW
Wyb = NewW
Wzb = NewW
detJ = abs(J(time) - J(time - 1)); % 前后两次目标函数的差值
Jt = J(2:time); % J(1)和J(2)存储了相同的值,从J(2)算起,迭代了(time - 1)次
figure,plot(Jt);% subplot(1,2,1)
xlabel(['权值为随机时,迭代次数为:',num2str(time - 1),'次']);
for i = 1:20
[net_j,net_k,y,z] = BackPropagation(w(i,:), Wxy, Wyz, Wyb, Wzb);
% 初始化权值(0.5和-0.5)
Wxy = 0.5 * ones(3,3);
Wyz = -0.5 * ones(3,1);
Wyb = 0.5 * ones(3,1);
Wzb = -0.5;
w = [w1; w2];
T = [1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1];
% 教师向量
% 以下是随机反向传播算法
delta_J = 0.001;
% [net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb);
% J(time) = 1 / 2 * power(norm(t - z), 2);
detJ = 2 * delta_J;
while time & 10000%detJ & delta_J
num = ceil(rand(1) * 20); % 选择产生一个1到20之间的随机数
x = w(num, :);
% 任取w中一个模式
t = T(num);
time = time + 1; % 计算迭代次数
[NewWxy, NewWyz, NewWyb, NewWzb, J(time)] = train(x, t, Wxy, Wyz, Wyb, Wzb);
% 更新权值
Wxy = NewW
Wyz = NewW
Wyb = NewW
Wzb = NewW
% detJ = abs(J(time) - J(time - 1)); % 前后两次目标函数的差值
Jt = J(2:time); % J(1)和J(2)存储了相同的值,从J(2)算起,迭代了(time - 1)次
figure,plot(Jt);% subplot(1,2,2),
xlabel(['权值为固定时,迭代次数为:',num2str(time - 1),'次']);
for i = 1:20
[net_j,net_k,y,z] = BackPropagation(w(i,:), Wxy, Wyz, Wyb, Wzb);
% 以下是成批反向传播算法
Eta = 0.01; % 学习因子
% 初始化权值(随机初始化)
Wxy = rands(3,3);
Wyz = rand(3,1);
Wyb = rand(3,1);
Wzb = rand();
SumDelta_Wxy = zeros(3,3);
SumDelta_Wyz = zeros(3,1);
SumError_xy = zeros(3,1);
SumError_yz = 0;
w = [w1; w2];
T = [1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1];
% 教师向量
delta_J = 0.001;
J(time) = 2 * delta_J;
detJ = 2 * delta_J;
% [net_j,net_k,y,z] = BackPropagation(x, Wxy, Wyz, Wyb, Wzb);
% J(time) = delta_J * 2; % 1 / 2 * power(norm(t - z), 2);
while time & 1000 %detJ & delta_J
time = time + 1; % 计算迭代次数
J(time) = 0;
for num = 1:20
x = w(num, :);
% 任取w1中一个模式
t = T(num);
[delta_Wxy, delta_Wyz, Error_xy, Error_yz, Jt] = BatchTrain(x, t, Wxy, Wyz, Wyb, Wzb);
SumDelta_Wxy = SumDelta_Wxy + delta_W
SumDelta_Wyz = SumDelta_Wyz + delta_Wyz';
SumError_xy = SumError_xy + Error_
SumError_yz = SumError_yz + Error_
J(time) = J(time) + Jt;
% 更新权值
Wxy = Wxy + SumDelta_W
Wyz = Wyz + SumDelta_W
Wyb = Wyb + Eta * SumError_
Wzb = Wzb + Eta * SumError_
detJ = abs(J(time) - J(time - 1)); % 前后两次目标函数的差值
Jt = J(1, 2:time); % J(1)和J(2)存储了相同的值,从J(2)算起,迭代了(time - 1)次
figure,plot(Jt);
xlabel(['权值为随机时,迭代次数为:',num2str(time - 1),'次']);
for i = 1:20
[net_j,net_k,y,z] = BackPropagation(w(i,:), Wxy, Wyz, Wyb, Wzb);
% 以下是成批反向传播算法
Eta = 0.001; % 学习因子
% 初始化权值(0.5和-0.5)
Wxy = 0.5 * ones(3,3);
Wyz = -0.5 * ones(3,1);
Wyb = 0.5 * ones(3,1);
Wzb = -0.5;
SumDelta_Wxy = zeros(3,3);
SumDelta_Wyz = zeros(3,1);
SumError_xy = zeros(3,1);
SumError_yz = 0;
w = [w1; w2];
T = [1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1];
% 教师向量
delta_J = 0.001;
while time & 1000 % detJ & delta_J
time = time + 1; % 计算迭代次数
J(time) = 0;
for num = 1:20
x = w(num, :);
% 任取w1中一个模式
t = T(num);
[delta_Wxy, delta_Wyz, Error_xy, Error_yz, Jt] = BatchTrain(x, t, Wxy, Wyz, Wyb, Wzb);
SumDelta_Wxy = SumDelta_Wxy + delta_W
SumDelta_Wyz = SumDelta_Wyz + delta_Wyz';
SumError_xy = SumError_xy + Error_
SumError_yz = SumError_yz + Error_
J(time) = J(time) + Jt;
% 更新权值
Wxy = Wxy + SumDelta_W
Wyz = Wyz + SumDelta_W
Wyb = Wyb + Eta * SumError_
Wzb = Wzb + Eta * SumError_
detJ = abs(J(time) - J(time - 1)); % 前后两次目标函数的差值
Jt = J(1, 2:time); % J(1)和J(2)存储了相同的值,从J(2)算起,迭代了(time - 1)次
figure,plot(Jt);
xlabel(['权值为固定时,迭代次数为:',num2str(time - 1),'次']);
for i = 1:20
[net_j,net_k,y,z] = BackPropagation(w(i,:), Wxy, Wyz, Wyb, Wzb);
d123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216一个目标函数经多次训练后的变化曲线:三、调用MATLAB实现BP网络其实MATLAB中可直接调用函数来构造神经网络,但自己编写程序实现有助于了解整个神经网络的各个细节。 使用Matlab建立前馈神经网络时可以使用到下面3个函数:newff :前馈网络创建函数
train:训练一个神经网络
sim:使用网络进行仿真123关于这3个函数的用法如下:1.newff函数(1)newff函数的调用方法newff函数参数列表有很多的可选参数,具体可以参考Matlab的帮助文档,这里介绍newff函数的一种简单的形式。net = newff(A,...
% 一个n*2的矩阵,第i行元素为输入信号xi的最小值和最大值
% 一个k维行向量,其元素为网络中各层节点数
% 一个k维字符串行向量,每一分量为对应层神经元的激活函数
'trainFun'); % 选用的训练算法1234(2)常用的激活函数常用的激活函数有:  a) 线性函数 (Linear transfer function):f(x) = x。该函数所对应的字符串为’purelin’。  b) 对数S形转移函数( Logarithmic sigmoid transfer function )。该函数所对应的字符串为’logsig’。  c) 双曲正切S形函数 (Hyperbolic tangent sigmoid transfer function ),也就是上面所提到的Sigmoid函数。该函数所对应的字符串为’tansig’。注:Matlab的安装目录下的toolbox\nnet\nnet\nntransfer子目录中有所有激活函数的定义说明。(3)常见的训练函数traingd:梯度下降BP训练函数(Gradient descent backpropagation)traingdx:梯度下降自适应学习率训练函数(4)一些重要的网络配置参数设置net.trainparam.goal:神经网络训练的目标误差
net.trainparam.show: 显示中间结果的周期
net.trainparam.epochs:最大迭代次数
net.trainParam.lr: 学习率12342.神经网络训练函数train%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 神经网络训练函数train
% 各参数的含义如下:
% X:网络实际输入
% Y:网络应有输出
% tr:训练跟踪信息
% Y1:网络实际输出
% E:误差矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[ net, tr, Y1, E ]
= train(net, X, Y )123456789103.sim函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 各参数的含义如下:
% net:网络
% X:输入给网络的K*N矩阵,其中K为网络输入个数,N为数据样本数
% Y:输出矩阵Q*N,其中Q为神经网络输出单元的个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Y = sim(net, X)1234567基于MATLAB自带函数的BP神经网络设计实例一个实例参考:参考链接:
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 神经网络中的激活函数 的文章

 

随机推荐