当前位置: 首页 > 知识库问答 >
问题:

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

墨寂弦
2023-03-14

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

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

  • 定义一个具有任意层数和每层神经元数的神经网络

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

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

共有2个答案

居星阑
2023-03-14

神经网络组件实际上为单元测试提供了极好的机会。要记住的是“我们确定这个软件应该表现出什么样的行为?”。我在博客中详细讨论了一些需要验证的关键点,包括:

  1. 有限差分验证-测试反向传播操作与组件函数的一致性-因为它应该是解析导数,所以应该与导数的数值近似值一致
  2. 序列化
  3. 与参考实现的一致性(如果有)-当您多次实现相同的功能时,这很有价值,例如GPU加速或基于FFT的卷积
  4. 性能和附加烟雾测试(视情况而定)

当然,使用众所周知的测试问题进行集成测试是一种不可或缺的补充,我会在随后的帖子中介绍这一点,但您的问题是关于单元测试的。

步建茗
2023-03-14

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

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

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

您还可以在实际数据集上测试它。我推荐Iris数据集。它很小,很容易学。如果测试通过,您可以看到您的网络真正工作,而不仅仅是求解数学函数。我个人觉得这很安慰。:)

为了确保您的测试不会运行太久,请设置一个合理的最大历元数。还要注意,您希望每次测试都能通过,直到您搞砸了一些事情,所以不要让它们太难通过。

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

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

 类似资料:
  • 我正在尝试实现一个简单的神经网络。我知道已经有很多可用的库,这不是重点。 我的网络只有3层:一个输入层一个隐藏层一个输出层 输出层有8个神经元,每个神经元代表不同的类。 我知道如何实现feedfoward算法,但我真的很难实现反向传播算法。 这是我到目前为止得出的结论: 我尝试使用Iris数据集进行测试:https://en.wikipedia.org/wiki/Iris_flower_data_

  • 我很难构建好的神经网络教学算法,因为有一些人工操作。第一件事:我的目标是教nn-xor函数,我使用sigmoid作为激活函数和简单的梯度下降。前馈很容易,但backprop在某种程度上令人困惑——大多数算法描述中常见的步骤有:1。计算输出层上的错误。2、将此错误传播到有关权重3的隐藏层。更新突触上的权重 所以我的问题:1。偏差也应该更新吗?如果是,如何更新?目前我随机选择偏差[0.5;1]?2.在

  • 我正在尝试用RELU实现神经网络。 输入层- 以上是我的神经网络结构。我对这个relu的反向传播感到困惑。对于RELU的导数,如果x 有人能解释一下我的神经网络架构的反向传播“一步一步”吗?

  • 考虑具有以下架构的卷积神经网络: Standford的深度学习教程使用以下等式来实现这一点: 然而,在使用这个等式时,我面临以下问题: 我做错了什么?有人能解释一下如何通过卷积层传播错误吗? 简单的MATLAB示例将受到高度赞赏。

  • 我们首先回顾DNN的反向传播算法。在DNN中,我们是首先计算出输出层的$$deltaL:deltaL = frac{partial J(W,b)}{partial zL} = frac{partial J(W,b)}{partial aL}odot sigma{'}(zL)$$ 利用数学归纳法,用$$delta{l+1}$$的值一步步的向前求出第l层的$$deltal$$,表达式为:$$delta

  • 拥有大量输入的神经网络会导致我的网络出现如下问题 神经网络陷入困境,前馈计算总是给出1.0的输出,因为输出和太大,而在进行反向传播时,梯度和太高,导致学习速度太快。 神经网络在所有层中使用tanh作为主动函数。经过深思熟虑,我想出了以下解决方案: 初始化较小的随机权重值(WeightRandom/PreviousLayerNeuronCount) 或 我对自己提出的解决方案感到不舒服。 解决方案1