3、在matlab中命令行窗口中定义输入P,输出T,·通过“newff(minmax(P),[5,1]构建BP神经网络,“[net,tr]=train(net,P,T)”进行网络训练,“sim(net,P)”得到仿真预测值。
4、在命令行窗口按回车键之后,可以看到出现结果d窗,最上面的Neural Network下面依次代表的是“输入、隐含层、输出层、输出”,隐含层中有5个神经元。
5、Progress下面的Epoch代表迭代次数,Gradient代表梯度,Vaildation Checks代表有效性检查,最后的绿色对勾代表性能目标达成。
6、最后将实际曲线和预测曲线绘制出来,可以看到使用BP神经网络预测的结果曲线基本和实际输出曲线一致。
当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次>epoch。(也就是说,所有训练样本在神经网络中都 进行了一次正向传播 和一次反向传播 )再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。
然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成多个Batch 来进行训练。**
Batch(批 / 一批样本):
将整个训练样本分成若干个Batch。
Batch_Size(批大小):
每批样本的大小。
Iteration(一次迭代):
训练一个Batch就是一次Iteration(这个概念跟程序语言中的迭代器相似)
为什么要使用多于一个epoch?
在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降来优化学习过程。如下图所示。因此仅仅更新一次或者说使用一个epoch是不够的。
随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。
那么,到底多少个epoch最合适,这个问题没有正确答案,对于不同的数据集,答案都不相同。
Batch Size
直观的理解:
Batch Size定义:一次训练所选取的样本数。
Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如GPU内存不大,该数值最好设置小一点。
为什么要提出Batch Size?
在没有使用Batch Size之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输入网络中,然后计算它们的梯度进行反向传播,由于在计算梯度时使用了整个数据库,所以计算得到的梯度方向更为准确。但在这情况下,计算得到不同梯度值差别巨大,难以使用一个全局的学习率,所以这时一般使用Rprop这种基于梯度符号的训练算法,单独进行梯度更新。
在小样本数的数据库中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的数据库,一次性把所有数据输进网络,肯定会引起内存的爆炸。所以就提出Batch Size的概念。
Batch Size合适的优点:
1、通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
matlab中epochs是计算时根据输出误差返回调整神经元权值和阀值的次数。验证方法:
(一)使用网络 linearlayer
1,cell输入形式
输入 P={[12] [21] [23] [31]}
目标值 T={4 5 7 7}
使用adapt
输入命令:
P={[12] [21] [23] [31]}
T={4 5 7 7}
net=linearlayer(0,0.1)
net=configure(net,P,T)
net.IW{1,1}=[0,0]
net.b{1}=0
[net,a,e]=adapt(net,P,T)
权重更新4次,最后值:
net.IW{1,1}= 1.56001.5200
net.b{1}=0.9200
仿真结果:[0][2][6.0000][5.8000]
2,矩阵输入形式
输入P=[1 2 2 32 1 3 1]
输出T=[4 5 7 7]
使用adapt
输入命令:
P=[1 2 2 32 1 3 1]
T=[4 5 7 7]
net=linearlayer(0,0.01)
net=configure(net,P,T)
net.IW{1,1}=[0,0]
net.b{1}=0
[net,a,e]=adapt(net,P,T)
权重更新一次,最后值:
net.IW{1,1}=0.49000.4100
net.b{1}= 0.2300
3,矩阵输入形式
输入P=[1 2 2 32 1 3 1]
输出T=[4 5 7 7]
使用train(其中设置epochs=1)
前提:对学习函数和训练函数加入显式的调用命令;
P=[1 2 2 32 1 3 1]
T=[4 5 7 7]
net=linearlayer(0,0.01)
net=configure(net,P,T)
net.IW{1,1}=[0,0]
net.b{1}=0
net=trian(net,P,T)
权重更新一次,最后值:
net.IW{1,1}=0.49000.4100
net.b{1}= 0.2300
结论:对于静态网络而言linearlayer,adapt的cell输入为在线学习,而矩阵输入为离线学习相当于train的一个回合。
至于动态网络:有时间再做。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)