我正在训练我的神经网络对图像中的一些东西进行分类。我裁剪了40x40像素的图像,并将其分类为某个对象。因此,它有1600个输入神经元,3个隐藏层(500、200、30)和1个输出神经元,必须说1或0。我使用Flood库。
我不能用QuasiNewtonMethod
训练它,因为它在算法中使用了一个大矩阵,而且它不适合我的记忆。所以我使用GradientDescent
,而ObjectiveFunctional
是NormalizedSquaredError
。
问题是通过训练它溢出了权重,并且对于每个输入,神经网络的输出是INF
或NaN
。
此外,我的数据集太大(当它是CSV格式时,大约为800mb),我无法完全加载它。因此,我制作了许多具有1000个实例的InputTargetDataSets
,并将其保存为XML(Flood的默认格式),并在随机打乱的每个数据集上训练一个历元。但当我只在一个大数据集(10000个实例)上训练它时,它也会溢出。
为什么会发生这种情况,我该如何防止?
我建议对输入进行规范化。你还应该考虑一下,如果你有1600个神经元。。输入层的输出会求和(如果是sigmoid神经元),可能会有很多问题。
打印出一些步骤非常有用。。例如在哪个步骤中溢出。
有一些关于神经元重量的提示。我推荐非常小的<0.01.也许如果你能提供更多关于NN、输入间隔、权重等的信息,我可以给你一些其他想法。
顺便说一句,我认为数学上已经证明了两层就足够了,所以如果你不使用一些模拟人眼的专门算法,就不需要三层隐藏层。。