C# 神经网络如何学习连续函数而不是离散函数?

C# 神经网络如何学习连续函数而不是离散函数?,c#,neural-network,C#,Neural Network,我想做的是让神经网络“学习”函数f(x)=x^2。我把这段代码源代码放在这里。如果有帮助的话,神经网络是用c#手工编码的(使用双精度) 其思想是,我给网络中的实数对(例如(1,1)、(2,4)、(3,9)),然后让网络在给定一个看不见的实数时输出正确的平方。输入由1个具有实数值的输入神经元给出,输出由外层(也是1个神经元)的输出给出。隐层有4个神经元 我的问题是输出神经元的输出在0和1之间(我使用的是sigmoid函数)。我从源代码学习神经网络,它们输出离散值(手写图像表示0、1..或9)。我解

我想做的是让神经网络“学习”函数f(x)=x^2。我把这段代码源代码放在这里。如果有帮助的话,神经网络是用c#手工编码的(使用双精度)

其思想是,我给网络中的实数对(例如(1,1)、(2,4)、(3,9)),然后让网络在给定一个看不见的实数时输出正确的平方。输入由1个具有实数值的输入神经元给出,输出由外层(也是1个神经元)的输出给出。隐层有4个神经元

我的问题是输出神经元的输出在0和1之间(我使用的是sigmoid函数)。我从源代码学习神经网络,它们输出离散值(手写图像表示0、1..或9)。我解决这个问题的方法是使用一个函数tan((pi*(2x-1))/2及其逆函数。它将(0,1)映射到实数。然后我将其逆函数应用到训练集。因此,当我给它输入数据时,我给它x,并将映射函数的逆函数应用到x^2

这似乎在(0,1)(例如0.999999996)映射到大实数(我认为双倍数不够精确)的上端的数字上存在实际问题。这是标准的处理方法,还是有更好的方法?另一个想法是使用大量的输出和输入神经元,给它们一个二进制向量(例如4个输入神经元,(0,0,0,1)是1的输入)。进一步的想法是使用比双精度更精确的小数


这项任务是对神经网络的一种很好的使用,还是不太合适?

是的,您提供的任务是一个相对简单且已知的例子

你需要做的是在最后一层中使用线性激活而不是sigmoid激活。在这种情况下,你只需将隐藏层单位的输出进行线性(仿射)组合。你还必须将损失函数更改为例如MSE,其设计用于处理实值函数,而不是(0,1)仅限间隔时间

更新: 假设
y1、y2、y3、y4
是隐藏层节点的激活。那么仿射激活的形式为:

w0 + w1 * y1 + w2 * y2 + w3 * y3 + w4 * y4
因此,这实际上是用标识函数替换
tanh
sigmoid

更新2:
是-线性激活的范围是一组所有实数。

双倍比十进制更精确。使用tan函数会产生新问题,因为它会迅速接近无穷大。通常使用tan设置限制,因此当数字高于/低于某个值时,结果会被迫为0或1。是否有具体的示例这样一个线性函数的例子?你所说的线性函数的范围是实数?一个线性函数是形式为y=mx的函数。一个仿射函数是y=mx+b。如答案所述,两者都适用于这种情况。请注意,对于神经网络,mx实际上是权重和输入之间的点积。