单元测试反向传播神经网络代码
Unit testing backpropagation neural network code
我正在从头编写一个反向传播神经网络迷你库,我需要一些帮助来编写有意义的自动化测试。到目前为止,我有自动测试来验证反向传播算法是否正确计算了权重和偏差梯度,但没有测试训练本身是否真的有效。
到目前为止,我的代码可以让我执行以下操作:
- 定义一个包含任意层数和每层神经元的神经网络。
- 它可以使用任何层激活函数。
- 也可以使用偏差。
- 神经元层目前只能全连接
- 训练只有梯度下降的BP。
- 必须使用训练集、验证集和测试集(none 这些集目前可以为空)。
鉴于所有这些,我可以编写什么样的自动化测试来确保正确实现训练算法。我应该尝试逼近什么函数(sin、cos、exp、二次函数等)?我应该从这个函数中采样数据的范围和密度是多少? NN 应该有什么架构?
理想情况下,该函数应该相当简单易学,这样测试就不会持续很长时间(1-3 秒),但也足够复杂,可以在一定程度上确定算法是否正确实施。
我正在为我的学位做类似的事情。您正在寻找的是集成测试,而不是单元测试。
单元测试只会告诉您代码是否按您希望的方式工作。要检查算法是否真的正常工作,您应该编写集成测试,在其中创建具有所有需要的依赖项(真实的,而不是模拟的)的网络。
创建网络后,您可以简单地尝试进行学习。测试简单的数学函数是很好的开始。对于更多维函数,您可以尝试 e.q。 Rosenbrock function。这非常好,因为您只需使用一个参数就可以更改它的维度。不过我只将它用于 GA 基准测试。
您也可以在真实数据集上进行测试。我推荐Iris Dataset。它非常小且易于学习。如果测试通过,您可以看到您的网络确实有效,而不仅仅是求解数学函数。我个人觉得很舒服。 :)
为确保您的测试不会 运行 太长,请设置合理的最大纪元数。还要注意,你希望你的测试每次都能通过,直到你搞砸了,所以不要让它们太难通过。
据我所知,我为鸢尾花数据集使用了 10 个隐藏神经元。在大约 5 次迭代内,您应该能够轻松获得至少 95% 的正确答案。
这样的测试可能需要几秒钟,但有一些是很好的。您不必每次都 运行 他们。但是,如果你进行了大规模的重构并且它们仍然通过,你就不必担心了。相信我 - 我去过那里。
神经网络组件实际上为单元测试提供了极好的机会。要记住的是 "what behavior are we sure this software should exhibit?"。我在 my blog post 中更详细讨论的一些要验证的关键点是:
- 有限差分验证 - 测试反向传播操作与组件函数的一致性 - 因为它应该是解析导数,所以它应该与导数的数值近似一致。
- 序列化
- 与参考实现的一致性(如果有)- 当您多次实现相同的功能时,例如 GPU 加速或基于 FFT 的卷积,这很有价值。
- 适当的性能和额外的烟雾测试。
当然,使用众所周知的测试问题进行集成测试是不可或缺的赞美,我在 subsequent post 中对此进行了介绍,但您的问题是关于单元测试的。
我正在从头编写一个反向传播神经网络迷你库,我需要一些帮助来编写有意义的自动化测试。到目前为止,我有自动测试来验证反向传播算法是否正确计算了权重和偏差梯度,但没有测试训练本身是否真的有效。
到目前为止,我的代码可以让我执行以下操作:
- 定义一个包含任意层数和每层神经元的神经网络。
- 它可以使用任何层激活函数。
- 也可以使用偏差。
- 神经元层目前只能全连接
- 训练只有梯度下降的BP。
- 必须使用训练集、验证集和测试集(none 这些集目前可以为空)。
鉴于所有这些,我可以编写什么样的自动化测试来确保正确实现训练算法。我应该尝试逼近什么函数(sin、cos、exp、二次函数等)?我应该从这个函数中采样数据的范围和密度是多少? NN 应该有什么架构?
理想情况下,该函数应该相当简单易学,这样测试就不会持续很长时间(1-3 秒),但也足够复杂,可以在一定程度上确定算法是否正确实施。
我正在为我的学位做类似的事情。您正在寻找的是集成测试,而不是单元测试。
单元测试只会告诉您代码是否按您希望的方式工作。要检查算法是否真的正常工作,您应该编写集成测试,在其中创建具有所有需要的依赖项(真实的,而不是模拟的)的网络。
创建网络后,您可以简单地尝试进行学习。测试简单的数学函数是很好的开始。对于更多维函数,您可以尝试 e.q。 Rosenbrock function。这非常好,因为您只需使用一个参数就可以更改它的维度。不过我只将它用于 GA 基准测试。
您也可以在真实数据集上进行测试。我推荐Iris Dataset。它非常小且易于学习。如果测试通过,您可以看到您的网络确实有效,而不仅仅是求解数学函数。我个人觉得很舒服。 :)
为确保您的测试不会 运行 太长,请设置合理的最大纪元数。还要注意,你希望你的测试每次都能通过,直到你搞砸了,所以不要让它们太难通过。
据我所知,我为鸢尾花数据集使用了 10 个隐藏神经元。在大约 5 次迭代内,您应该能够轻松获得至少 95% 的正确答案。
这样的测试可能需要几秒钟,但有一些是很好的。您不必每次都 运行 他们。但是,如果你进行了大规模的重构并且它们仍然通过,你就不必担心了。相信我 - 我去过那里。
神经网络组件实际上为单元测试提供了极好的机会。要记住的是 "what behavior are we sure this software should exhibit?"。我在 my blog post 中更详细讨论的一些要验证的关键点是:
- 有限差分验证 - 测试反向传播操作与组件函数的一致性 - 因为它应该是解析导数,所以它应该与导数的数值近似一致。
- 序列化
- 与参考实现的一致性(如果有)- 当您多次实现相同的功能时,例如 GPU 加速或基于 FFT 的卷积,这很有价值。
- 适当的性能和额外的烟雾测试。
当然,使用众所周知的测试问题进行集成测试是不可或缺的赞美,我在 subsequent post 中对此进行了介绍,但您的问题是关于单元测试的。