在PyBrain回归中神经网络输出相同,使用什么激活函数或修改?
我有一个神经网络,它有一个输入层、三个隐藏神经元和一个输出层。我有720个输入值和对应的目标值,其中540个用来训练,180个用来测试。
当我用逻辑 sigmoid 函数或双曲正切 sigmoid 函数训练我的网络时,测试时得到的输出都是一样的,也就是说,我的180个输出值都是同一个数字。当我使用线性激活函数时,结果是 NaN(不是一个数字),因为数值显然变得太大了。
在这种情况下,有没有什么激活函数可以使用?或者有什么改进的建议吗?如果需要,我可以更新问题,提供更多细节和代码。
2 个回答
Newmu说得对,这里可能是缩放的问题;你需要把输入的数据调整到一个有效的范围内。(他们提到的标准化到零均值、单位方差并不是一个好选择,因为这意味着大约三分之一的数据会落在[-1, 1]之外……)我不太了解pybrain,但在scikit-learn中,你可以使用sklearn.preprocessing.MinMaxScaler
。
另外,在评论中你提到你的数据集长这样:
横轴是输入,纵轴是目标。所以,当你看到一个输入是200时,有一个训练样本说它是80,还有一个说是320;那你希望它说什么呢?一个“最佳”的神经网络(虽然实现起来可能很难)会预测大约200。
你可能需要考虑如何重新构建你的学习问题,使得输入和目标之间的关系更加一致。
神经网络在处理输入数据时,如果数据的范围不稳定(比如你的数据范围在0到1000之间),就会出现问题。如果你的输出单元是tanh类型的,它们甚至无法预测-1到1或0到1之外的值!
你应该尝试对数据进行重新中心化和缩放(也就是让数据的平均值为零,方差为1,这在数据科学界叫做标准化)。这个过程不会丢失信息,所以在你训练完网络并进行预测后,可以把数据恢复到原来的范围。
另外,使用线性输出单元可能是最好的选择,因为它对输出的范围没有任何假设。我发现tanh单元在低维输入/隐藏/输出的循环神经网络中表现得更好。