我正在尝试做的是让神经网络“学习”函数f(x)= x ^ 2。我的代码基于此this来源。如果有帮助(使用双打),神经网络在c#中被手动编码。
我的想法是我提供网络对的实数,(例如(1,1),(2,4),(3,9)),然后让网络输出正确的方形,当给出一个看不见的真实。输入由1输入神经元和real的值给出,输出由out层的输出(也是1个神经元)给出。隐藏层中有4个神经元。
我的问题是输出神经元的输出在0和1之间(我正在使用sigmoid函数)。我从this源学习神经网络,在那里输出离散值(手写图像代表0,1 ......或9)。我绕过这个方法是使用函数tan((pi *(2x - 1))/ 2及其逆。这将(0,1)映射到实数。然后我将此逆应用于训练集所以当我提供数据时,我给它x,并且映射函数的反函数应用于x ^ 2.
这似乎与(0,1)(例如0.999999996)上端的数字映射到巨大的实数有实际问题(我认为双精度不够精确)。这是做事的标准方式,还是有更好的方法?另一个想法是使用大量输出和输入神经元并给它们一个二进制向量(例如4个输入神经元,(0,0,0,1)是1的输入)。另一个想法是使用比双精度更精确的小数。
这项任务是否很好地利用了神经网络,还是不恰当的呢?
答案 0 :(得分:1)
是的,您提供的任务是一个相对简单且已知的示例。
您需要做的是使用线性激活而不是S形激活作为最终层中的激活。在这种情况下,您只需对隐藏层单元的输出进行线性(仿射)组合。您还必须将损失函数更改为例如MSE旨在处理实值函数而不是(0,1)区间。
<强>更新强>
我们假设y1, y2, y3, y4
是隐藏层节点的激活。然后仿射激活的形式如下:
w0 + w1 * y1 + w2 * y2 + w3 * y3 + w4 * y4
所以这实际上是用身份函数替换tanh
或sigmoid
。
更新2: 是 - 线性激活的范围是一组所有实数。