我有一个小问题。
训练具有大数字(> 1)的神经网络的最佳方法是什么,例如:
input[][] {{10,100,1000}};
desiredOutput {{5000}};
(这背后并没有任何意义,只是例如。)
因为正常的神经元只能输出-1到1,所以网络不能输出5000.在开始时将它除去并在结束时将其相乘是否有意义?
input[][] {{10,100,1000}}; --> {{0.001,0.01,0.1}}; (divide by 10'000)
desiredOutput {{0.5}}; --> {{5000}}; (multiply by 10'000)
有更好或更常用的方法吗?
答案 0 :(得分:1)
如果数字是正数并且在示例中有多个数量级的差异,那么对数缩放可能是有意义的。否则,神经网络执行的输出计算将由大输入控制,而较小数字的修改将产生很小的影响。
这可能不是您想要的,因为对于大多数应用程序而言,相对变化是重要的。如果将输入从1更改为2(100%),则可能预期输出的影响大于将1000更改为1001(0.1%)时的影响,但绝对差异相同。
这可以通过对数缩放来避免。
示例:要将范围从1变换到10000到范围从0到1,您可以使用以下公式:
transformedInput = (Math.log10(input) - 1.0) / 4.0
要将输出转换回原始范围,请使用取幂:
output = Math.pow( 10.0, 4.0 * output + 1.0 );
答案 1 :(得分:0)
听起来你想用网络进行回归。在这种情况下,对输出层使用线性激活函数是有意义的。原因是Sigmoidal函数不能输出超出其指定范围的值,如您所述。它可能也有助于使您的输入居中和规范化。
答案 2 :(得分:0)
您要问的是normalization
,是的,数据应该归一化到[0; 1]或[-1; 1]在将其输入您的网络之前。
您将从网络获得的结果也将缩放到相同的范围,但这并不意味着应该在输出值上使用相同的系数作为用于标准化输入值的系数。
输出值可能与输入具有非常不同的含义,并且通常没有理由以与输入相同的方式对其进行缩放。另请参阅Why do we have to normalize the input for an artificial neural network?