本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
本文收集和展示一些使用matlab神经网络工具箱训练BP神经网络时易踩的坑。
由于matlab在2012b版本之前并不会自动将数据归一化,
因此,在2013之前的教材,都会将数据自行归一化,再投到网络中,这是个繁琐的过程。
而很多初学者并不知道,只是照抄代码,因此,每次都要进行繁琐的归一化反归一化操作。
而事实上,现在的版本完全不需要自己进行归一化,工具箱已经会自动做归一化处理了。
现在的版本归一化和不归一化的结果差异不会太大
,
仍然是版本变迁,使用了老式教材代码造成的坑
老版本matlab不支持分割数据,
在老教材,一般会在建模前,先预留测试数据,
训练完后再把测试数据进行效果检验。
而现在的版本都默认自动开启数据分割,
如果自行预留了预测数据,
一定要把网络数据分割的test占比关掉
事实上这是个很大的坑,
如果没关掉test占比,
工具箱在建模时会再划分15%的数据作为预测数据,
这15%的数据不参与任何过程,
这样相当于浪费了这15%的数据。
如果自己独自抽出测试数据,
记得要把数据分割test占比分配到训练中,如下:
net.divideParam.trainRatio = 0.85 ; % 默认0.7
net.divideParam.valRatio = 0.15; % 默认0.15
net.divideParam.testRatio = 0; % 默认0.15
matlab工具箱提供了非常多的训练方法,
刚开始时,总喜欢在不同的方法上试,
实际上matlab推荐的只有2或3种训练方法,
一是小数据,内存足,绝对推荐trainlm.效果几乎是无法质疑了。
二是大数据,trainlm跑不动推荐trainscg或trainrp。
这2或3种训练方法几乎成了定式,
在其它方法上试,很多时候是徒劳的
当然,也有可能有更好的效果,
但跑出比trainlm,trainscg,trainrp效果更好的,
那真的好难,
如果时间不多的同学,建议就如上所用就好
net.iw,net.lw,net.b 中记录了输入层权重,网络层权重,和阈值,这是毫无疑问的。
但代入公式后,却发现和网络sim得到的结果不一致,一直摸索了很久。
最后发现原因是,自matlab2012b之后,网络默认会自动归一化(也可自行关掉),
这样提出来的w,b,是自动归一化后的数据训练的网络对应的权重阈值,
使用前需要自行将数据归一化,并将结果反归一化,才能与sim对得上。
End