我需要训练一个网络来增加或增加2个输入,但是在20000次迭代之后,它似乎并不适合所有点.更具体地说,我在整个数据集上训练它并且它在最后几点很接近,但似乎对第一个端点没有任何好处.我规范化数据,使其介于-0.8和0.8之间.网络本身由2个输入3个隐藏神经元和1个输出神经元组成.我还将网络的学习率设置为0.25,并将其用作学习函数tanh(x).
对于在数据集中最后训练的点,它非常接近,但对于第一点,它似乎不能很好地近似.我不知道它是什么,它无法帮助它调整好,无论是我正在使用的拓扑还是其他什么?
此网络的隐藏层中有多少神经元适合?
由权重= {1,1},偏差= 0和线性激活函数的单个神经元组成的网络执行两个输入数的相加.
乘法可能更难.以下是网络可以使用的两种方法:
将其中一个数字转换为数字(例如,二进制)并执行乘法,就像在小学一样.a*b = a*(b0*2^0 + b1*2^1 + ... + bk*2^k) = a*b0*2^0 + a*b1*2^1 + ... + a*bk*2^k
.这种方法很简单,但需要与输入的长度(对数)成比例的可变数量的神经元b
.
取输入的对数,添加它们并对结果取幂.a*b = exp(ln(a) + ln(b))
该网络可以处理任何长度的数字,只要它可以足够接近对数和指数.
可能为时已晚,但一个简单的解决方案是使用RNN(回归神经网络).
将数字转换为数字后,您的NN将从左到右的数字序列中取几个数字.
RNN必须循环其输出之一,以便它可以自动理解有一个数字要携带(如果总和为2,则写入0并携带1).
要训练它,你需要给它输入由两个数字组成的输入(一个来自第一个数字,第二个来自第二个数字)和所需的输出.RNN最终会找到如何做到这一点.
请注意,此RNN只需知道以下8个案例即可学习如何将两个数字相加:
带进位的1 + 1,0 + 0,1 + 0,0 + 1
1 + 1,0 + 0,1 + 0,0 + 1无进位