我已经学习了一些CNTK Python教程,并且尝试编写一个极度基础的单层神经网络来计算逻辑与运算。我的代码是可以运行的,但是网络无法学习——实际上,每训练一个小批次,损失值就变得越来越糟糕。
训练输出示例
Minibatch: 0, Loss: -164.9998, Error: 0.75Minibatch: 20, Loss: -166.0998, Error: 0.75Minibatch: 40, Loss: -167.1997, Error: 0.75Minibatch: 60, Loss: -168.2997, Error: 0.75Minibatch: 80, Loss: -169.3997, Error: 0.75Minibatch: 100, Loss: -170.4996, Error: 0.75Minibatch: 120, Loss: -171.5996, Error: 0.75Minibatch: 140, Loss: -172.6996, Error: 0.75Minibatch: 160, Loss: -173.7995, Error: 0.75Minibatch: 180, Loss: -174.8995, Error: 0.75Minibatch: 200, Loss: -175.9995, Error: 0.75Minibatch: 220, Loss: -177.0994, Error: 0.75Minibatch: 240, Loss: -178.1993, Error: 0.75
我实在不明白这是怎么回事。错误率一直卡在0.75,我想这意味着网络的表现和随机猜测一样。我不确定是否是自己误解了人工神经网络架构的要求,还是误用了这个库。
任何帮助都将不胜感激。
回答:
你正在尝试用softmax作为最终层来解决一个二元分类问题。softmax层在这里并不合适,它只适用于多类别(类别数>=3)的问题。
对于二元分类问题,你应该进行以下两个修改:
- 在输出层添加一个sigmoid层(这将使你的输出看起来像一个概率)
- 使用binary_cross_entropy作为你的评判标准(你需要至少使用这个版本)