单元测试反向传播神经网络代码

时间:2015-02-28 22:22:01

标签: unit-testing neural-network backpropagation

我正在从头开始编写一个backprop神经网络迷你库,我需要一些帮助来编写有意义的自动化测试。到目前为止,我已经进行了自动化测试,验证了backprop算法是否正确计算了权重和偏差梯度,但没有测试培训本身是否真正有效。

我到目前为止的代码让我可以执行以下操作:

  • 定义每层有任意数量的层和神经元的神经网络。
  • 它可以使用任何图层激活功能。
  • 也可以使用偏见。
  • 神经元层现在只能完全连接。
  • 训练只是具有梯度下降的BP。
  • 必须使用火车,验证和测试装置(目前这些装置都不能为空)。

考虑到所有这些,我可以编写什么样的自动化测试来确保正确实施训练算法。我应该尝试近似什么函数(sin,cos,exp,quadratic等)?我应该在什么范围内以及如何密集地从该函数中采样数据? NN应该采用什么架构?

理想情况下,该函数应该相当简单易学,因此测试不会持续很长时间(1-3秒),但也足够复杂,以确保算法正确实现。

2 个答案:

答案 0 :(得分:6)

我正在为我的学位做类似的事情。您正在寻找的是集成测试,而不是单元测试。

单元测试仅告诉您代码是否按您希望的方式工作。要检查算法是否实际正常工作,您应该编写集成测试,在其中创建具有所有必需依赖项的网络(真实的,而不是模拟)。

创建网络后,您可以简单地尝试进行学习。简单数学函数的测试有利于开始。对于更多维度函数,您可以尝试e.q. Rosenbrock function。它非常好,因为你可以用一个参数改变它的维度。我虽然只将其用于GA基准测试。

您还可以在真实数据集上进行测试。我推荐Iris Dataset。它非常小,易于学习。如果测试通过,您可以看到您的网络确实有效,而不仅仅是解决了数学函数。我个人觉得很安慰。 :)

要确保测试运行时间不长,请设置合理的最大纪元数。另请注意,您希望您的测试每次都要通过,直到您搞砸了,所以不要让它们太难以通过。

据我记得,我使用10个隐藏神经元作为虹膜数据集。在大约5次迭代中,您应该能够轻松获得至少95%的正确答案。

这样的测试可能需要几秒钟,但有一些是好的。您不必每次都运行它们。但是,如果你进行大规模的重构,他们仍然通过你,你不必担心。相信我 - 我去过那里。

答案 1 :(得分:2)

神经网络组件实际上为单元测试提供了绝佳的机会。要记住的是“我们确定该软件应该表现出什么样的行为?”。我在my blog post中更详细讨论的一些要验证的关键点是:

  1. 有限差分验证 - 测试反向传播操作与组件函数的一致性 - 因为它应该是解析导数,它应该与导数的数值近似一致。
  2. 序列化
  3. 与参考实现的一致性(如果有) - 当您多次实现相同的功能时,这很有用,例如GPU加速或基于FFT的卷积。
  4. 视情况而定的性能和额外的烟雾测试。
  5. 当然,使用众所周知的测试问题的集成测试是必不可少的恭维,我在subsequent post中介绍了这一点,但是您的问题是关于单元测试的。