我要做的是让一个神经网络‘学习’函数f(x) = x^2,我是基于这里的代码这源代码。如果这有帮助的话,神经网络是用c#手工编码的(使用双倍)。
其思想是,我给网络对的reals,(例如(1,1),(2,4),(3,9)),然后让网络,然后输出正确的平方,当给一个看不见的实数。输入由一个具有实值的输入神经元给出,输出由输出层(也是一个神经元)输出。隐层内有4个神经元。
我的问题是输出神经元的输出介于0到1之间(我使用的是sigmoid函数)。我从这源学习神经网络,它们输出离散值(要么手写图像表示0,1 .或9)。我的方法是使用一个函数tan(pi*(2x-1))/2和它的逆函数。这个映射(0,1)到reals。然后,我将它的反作用力应用于训练集。所以当我给它数据时,我给它x,以及应用于x^2的映射函数的逆。
在(0,1) (例如,0.999999996)的上端的数字映射到巨大的实数(我认为双倍不够精确)时,这似乎有实际的问题。这是标准的做事方式,还是有更好的方法?另一个想法是使用大量的输出和输入神经元,并给它们一个二进制向量(例如,4个输入神经元,(0,0,0,1)是1的输入)。另一个想法是使用比双倍更精确的小数。
这个任务是很好地利用了神经网络,还是不太合适?
发布于 2016-07-06 10:43:39
是的,您提供的任务是一个相对简单和已知的例子。
你必须做的是使用线性激活而不是乙状结肠激活作为最后一层的激活。在这种情况下,您只需将隐藏层单元的输出进行线性(仿射)组合。您还必须将损失函数更改为例如MSE,这是为了处理一个实际值函数,而不是(0,1)间隔。
更新:,让我们假设y1, y2, y3, y4是隐藏层节点的激活。然后仿射激活是一种形式:
w0 + w1 * y1 + w2 * y2 + w3 * y3 + w4 * y4这实际上是用恒等函数代替tanh或sigmoid。
更新2:是的-线性激活的范围是所有实数的集合。
https://stackoverflow.com/questions/38219939
复制相似问题