bp神经网络学习
1.input(1:m,:)‘含义
矩阵A第一列的转置矩阵。(x,y)表示二维矩阵第x行第y列位置的元素,x为:则表示所有的行。因此,A(:,1)就表示A的第1列的所有元素,这是一个列向量。
所以这里input(1:m,:)表示1到m行,所有列,而后面有个'这代表转置,综合来看就是将一个1到m行,所有列的矩阵进行转置。
2.如何在workspace中导入数据
首先点击左上角的import data
选择要导入的文件即可,之后会弹出新的界面,界面如下:
这里用到的地方就是range(范围)以及matrix(矩阵),range选择自己想要的的行与列即可。
之后点击对勾就可以导入到workspace里面。
3.newff函数
参考文章:
Matlab中newff函数使用方法和搭建BP神经网络的方法-CSDN博客
net = newff(data,label,[8,8],{'tansig','purelin'},'trainlm')
data:训练时网络的输入数据。newff函数会把data的一列当作一个样本,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置data.‘
label:对应输入数据的标签,也可以看作真实输出。同上,newff函数会把label的一列当作一个样本的标签,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置label.‘
[8,8]:用于确定神经网络隐藏层的层数以及每层的神经单元个数。[8,8]就表示该网络包含两个隐藏层,每个隐藏层有8个神经单元
{‘tansig’,‘purelin’}:表示个隐藏层所用的激活函数。{‘tansig’,‘purelin’}表示第一层用tansig激活函数,是一种S型激活函数;第二次用purelin激活函数,是一种线性型激活函数。常见的激活函数如下:
logsig:对数S型函数
tansig:正切S型函数
purelin:线性型函数
‘trainlm’:确定训练函数,默认为trainlm函数,该方法需要占用更大的存储空间,使用了Levenberg-Marquardt算法,对于中等规模的BP神经网络有最快的收敛速度。由于其避免了直接计算赫赛矩阵,从而减少了训练中的计算量,但需要较大内存量,随着神经元的增多,训练时间增加较大。常见的训练方法如下:
?
traingd:梯度下降算法
traingdm:带动量的梯度下降算法
traingda:学习率变化的梯度下降算法
traingdx:学习率变化带动量的梯度下降算法
trainrp:RPROP算法,内存需求小,适用于大型网络
trainoss:OneStep Secant Algorithm,计算量与内存需求较小,适用于大型网络
(2)其他参数设置:
net.trainParam.goal = 1e-3 :确定目标值为0.001,到此值时训练停止
net.trainFcn=‘trainlm’ :确定训练函数trainlm。如果newff()中设置了,后续可以用不设置
net.trainParam.lr = 0.1 : 确定学习率为0.1
net.divideFcn = ‘’ :取消newff()默认再次划分操作。newff()默认将训练集重新划分6:2:2,训练集:测试集:验证集,在训练过程中会自动在某一处停止,我认为是为了防止过拟合吧,实践中在新训练集损失和新验证集损失下降不明显,且验证损失有上升的趋势时停止。对于数据本来就少的情况,建议取消划分。
net.trainParam.epochs = 1000 :训练最大迭代次数
net.trainParam.min_grad =1e-24 : 最小梯度值,到此值时训练停止
4.net.iw与net.b的含义
MATLAB中多层网络的net.lw{i,j}和net.b{k}的含义 - 知乎 (zhihu.com)
先假设神经网络结构,{ 9 [80 50 20] 1 };9为输入层,[80 50 20]为隐层,1为输出层。
- net.iw{1,1} 表示?输入层?到?第1层隐层?的权重,为80*9的矩阵;
- net.lw{2,1} 表示?第1层隐层?到?第2层隐层?的权重,为50*80的矩阵;
- net.lw{3,2} 表示?第2层隐层?到?第3层隐层?的权重,为20*50的矩阵;
- net.lw{4,3} 表示?第3层隐层?到?输出层?的权重,为1*20的矩阵;
- net.b{1} 表示?第1层隐层?的偏置,为80*1的矩阵;
- net.b{2} 表示?第2层隐层?的偏置,为50*1的矩阵;
- net.b{3} 表示?第3层隐层?的偏置,为20*1的矩阵;
- net.b{4} 表示?输出层?的偏置,为1*1的矩阵;
可以以此类推。
所以net.iw{1,1},模式也是固定的,仅表示输入层到第1层隐层的权重,之后就net.lw的事情了。net.lw{i,j}?表示?第j层隐层?到?第i层隐层?的权重。net.b{k}?表示?第k层隐层?的偏置或者说阈值,结构都为列向量。可以看出,这里假设的隐含层只有3层[80 50 20],但net中将最后一层输出层也当隐含层用了,所以?i?和?k?可以取到4。
知道权重和偏置的位置,可以用算法优化,如遗传算法等。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!