【问题标题】:Tensorflow: get NaN in “moving_variance“ in one layer when using batch_norm functionTensorflow:使用batch_norm函数时,在一层的“moving_variance”中获取NaN
【发布时间】:2018-08-23 18:22:25
【问题描述】:

问题:

在使用SE_Inception_resnet_v2 训练分类模型后,我使用了一张看不见的图像进行预测。然而,结果总是一样的。例如,结果一直是 logits = [.1,.2,.3]

通过调试代码,我发现使用tensoflow的batch_norm函数归一化的值在一个特定层中都是零,使用batch_norm函数的其他层仍然可以输出归一化的输入值。在我的例子中,它位于输出所有零值的 Reduction_B/cond/Merge:0 节点中。

此外,我检查了该特定层上 batch_norm 函数的输入数据和参数。输入数据很好,但是,参数 moving_variance 是 NaN 但moving_mean 很好。有趣的是,之前的 moving_variance 更新也很好。

我认为这是我的问题的原因,谁能解释可能是什么原因,我该如何解决?谢谢

【问题讨论】:

  • nan 的差异表明您的输入在某些时候可能都是相同的......但即便如此,正是这个原因,tensorflow 的 batch_norm 实现具有variance_epsilon。至于解决问题... moving_variance 不应该在训练模式下使用,那么您可以在训练模式下测试行为(对于您的预测图像)吗?您可能在某个时候有一个单一的无效图像,将值设置为 NaN,您可能只需要重置这些移动平均值(这将很快重新训练自己。)
  • 已解决,已在下方发布解决方案。虽然我的输入数据没有问题,但你告诉我检查的正确方向。非常感谢,杰克!

标签: tensorflow


【解决方案1】:

现在问题已经解决了。解决方法是 batch 的大小必须大于 1。我将在下面发布两个案例以显示一个有效,另一个不适合我的案例。

案例 1:(失败)

训练样本数:10
批量:1
迭代次数:10

案例2:(成功)

训练样本数:10
批量:2
迭代次数:5

【讨论】:

  • 我还在带有输入 (None, 1, 1, 512) 的 BatchNormalization 层的移动平均值中得到 NaN,为此我提供了一批 1 个输入。如果我将 tensorflow 用于 python,它对预测没有影响,但是当保存模型并尝试从 tensorflowjs 使用它时,所有输出都变为 NaN。仍然需要弄清楚如何克服这一点。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2016-08-02
相关资源
最近更新 更多