这周工作主要是完成了BP神经网络的复现,使用c++,对整个神经网络有了一个初步的了解。下面谈一下个人收获与总结。
10.1-10.3完成了整个网络的编写,由于时间上的考虑,本次程序没有从零开始,一开始看了别人写的程序,复现一个加法,原来只是有神经网络、学习、收敛这些概念,看了别人的程序大致架构发现复现一个二次函数没什么复杂的东西,然后开始自己编写二次函数的实现即y=x*x。数据的输入,神经网络的建立,网络训练、验证和测试。网络结构单输入单输出,单隐层神经网络,对于复现基本函数,单隐层神经网络可以实现。输入输出节点一个,隐含层节点10个(依据输入和输出节点数再加一个常数),样本50个,0.01-0.99中的奇数,验证集0.02-0.98中的偶数(c++样本设置有些麻烦,可能样本不按规律最后效果会更好),测试集9个(0.155每次加0.1),最后拟合效果还行,0.3的阈值(相对误差),验证集正确率0.88,测试集图像近似拟合为二次曲线,单隐层使用RELU,输出层使用Sigmoid。整个过程我没有使用c++中的框架,所以程序中使用了大量的for循环,这样程序执行效率不高。
在这里,我总结个人遇到的一些问题和方法。
1、代码敲完,先自己查看两边,尤其是公式。(这里的公式我使用的吴恩达老师上课讲的公式,包括损失函数、迭代等),我自己一般会发现好几处错误。
2、c语言中某个数组值本不该变化却发生改变,很有可能前面其它数组维数设置错误。我求矩阵的转置时,由于行列设置错误,导致我的另外参数矩阵w2值所有元素直接从0变成0.5。这种情况以前也出现过
3、使用出发符号“/”时,两个int数字相除,如1/10,结果为0,应使其中一个数字带小数。
4、样本数据归一化,使数据均在0-1之间。一开始我样本集X为1-100,损失函数训练几次后直接是无穷大,归一化后这个问题消失
5、叠加求和之前要清零。程序执行后误差函数不收敛,发现求和(50个样本求均值)后没有清楚前一次叠加的结果。在测试集时,又是该问题。
6、矩阵(数组)相乘时注意角标的变化
7、学习率初设为0.01,训练一定次数后,降低学习率为0.0001,拟合效果进一步改善。
反思:
1以前出现过的问题在以后编程中还可能继续出现
2处理问题没有思路时,看看想要的结果是什么。在添加测试集后,输出不太理想,又仔细看了代码,找不到问题,于是从源头出发,先看看训练集的输出,发现效果还行,又仔细看测试集程序,发现前一次没有清零
3对于循环,找到了debug的方法,也算是一点小进步吧
本次实验感谢秋雨师兄的指点,对于阈值,准确率、过拟合等概念有了一定的认识,但相关内容知识还远远不够,要赶快把吴恩达老师的课程上完。