在用Java编写了一个简单的反向传播和前馈神经网络类之后,我正在尝试一个阴影投射神经网络,以检查一个四边形(或三角形)是否在顶点上投射阴影。
输入(归一化,总共8+2*目标数):
- 点光源坐标 xL 和 yL
- 三角形或四边形对象的坐标 xt1,xt2,xt3 , yt1,yt2,yt3
- 目标顶点坐标 xT(i), yT(i)
输出(归一化,总共目标数):
- (点 i):有阴影(1.0f)或无阴影(0.0f)
问题: 它需要多少个神经元来思考?我是否需要尝试所有隐藏层神经元数量组合、隐藏层数量、最小训练迭代次数,…?有没有办法预见这一点?
问题: 这种方法与常规光线追踪器在处理数百万顶点时的性能如何(神经网络似乎比光线追踪器更容易并行化)?
回答:
问题:这种方法与常规光线追踪器在处理数百万顶点时的性能如何(神经网络似乎比光线追踪器更容易并行化)?
您试图解决的问题似乎并不适合使用机器学习模型。这种方法应该应用于复杂的统计数据问题,对于这些问题,找到好的算法解决方案对人类来说太难了。对于这种简单的问题(在您可以找到高效算法的意义上),您可以深入分析(因为它只是二维/三维数据),应该使用经典方法,而不是神经网络(或任何其他机器学习模型)。
即使您尝试这样做,您的问题表示准备得相当不好,网络不会通过展示这样的数据来学习“阴影的概念”,与您的数据一致的神经网络可以表示太多的模型。即使是训练后的网络的效率似乎也无法与“算法”替代方案相媲美。
总结来说 – 没有理由使用这种方法,事实上,使用它们:
- 不会运作良好,因为问题表示不佳(我看不到一个好的表示“从头脑中冒出来”)
- 即使它能运作,也不会有效
问题:它需要多少个神经元来思考?我是否需要尝试所有隐藏层神经元数量组合、隐藏层数量、最小训练迭代次数,…?有没有办法预见这一点?
正如我之前所说,无论您使用什么参数,它都不会很好地学习这种类型的数据。但为了“将来参考” – 对于“简单”的神经网络,实际上您总是只需要一个隐藏层。更多的隐藏层在大多数情况下实际上不会有帮助,因为梯度消失现象(深度学习是其成功的解决方案)。对于隐藏层的大小有一些经验法则,但没有真正的数学答案。一个好的选择是使用大量隐藏单元并添加强正则化,这将防止网络过拟合,这可能是隐藏层太大的结果。关于迭代次数 – 您永远不应该将其作为参数。网络应该训练到它不满足某些明确定义的停止标准为止 – 迭代次数不是其中之一。最经典且效果良好的方法是测量泛化误差(在独立的验证集上的误差),当它开始上升时 – 停止学习过程。