BP神经网络

        这周工作主要是完成了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的方法,也算是一点小进步吧

本次实验感谢秋雨师兄的指点,对于阈值,准确率、过拟合等概念有了一定的认识,但相关内容知识还远远不够,要赶快把吴恩达老师的课程上完。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值