Python Tensorflow-预测输出取决于批次大小

Python Tensorflow-预测输出取决于批次大小,python,tensorflow,deep-learning,batch-normalization,Python,Tensorflow,Deep Learning,Batch Normalization,我在Tensorflow中实现了一个生成性对抗网络。在测试期间,如果我使用培训期间使用的相同批处理大小生成图像,则生成的图像非常好(64);如果我一次生成一个图像,结果会很糟糕 可能的原因有2个: 批量标准化 错误使用tf.shape来获取动态批量大小 这是我的密码: 您可能还有其他bug,但批处理规范化在这里肯定是一个大问题 批量标准化计算每层所有变量的平均值和方差,以便进行标准化。这意味着作为变量的实际平均值和方差的代理,意味着在整个总体上而不是在子集(小批量)上估计的平均值和方差。如

我在Tensorflow中实现了一个生成性对抗网络。在测试期间,如果我使用培训期间使用的相同批处理大小生成图像,则生成的图像非常好(64);如果我一次生成一个图像,结果会很糟糕

可能的原因有2个:

  • 批量标准化
  • 错误使用tf.shape来获取动态批量大小
这是我的密码:


您可能还有其他bug,但批处理规范化在这里肯定是一个大问题

批量标准化计算每层所有变量的平均值和方差,以便进行标准化。这意味着作为变量的实际平均值和方差的代理,意味着在整个总体上而不是在子集(小批量)上估计的平均值和方差。如果您的小批量足够大,则近似的平均值和方差与真实值足够接近,但如果您的小批量中只有一个示例,则平均值和方差的估计显然将是灾难性的

要解决这个问题,需要在完成培训后,从输入的某个大子集(大于一个小批量)计算所有模型变量的均值和方差。然后(以某种方式)将这些值插回批次标准化层,并关闭小批次的均值和方差计算。这不是一件小事,但我假设您使用的任何库都可以处理这个问题。如果一个库不能处理这个问题,那么它是相当无用的,因为训练过的模型永远无法使用(除非你也像你那样在小批量上对它进行评估)


经过快速搜索,我在网上找到了这个。它可能被弃用,也可能有更好的

问题实际上在于批量标准化。批量规范化有两个阶段:培训和测试(推理)。在训练阶段,批次标准化使用批次统计数据(平均值和标准偏差)进行标准化,而在测试阶段,它使用从孔数据集收集的统计数据。在训练阶段(即使用<代码>衰减参数)使用移动平均收集此平均统计信息

为了区分这两个阶段,
层。batch_norm
具有名为
is_training
的参数,该参数在训练期间应设置为
True
,在推理时应设置为
False
。最简单的方法是使用
占位符
并键入
tf.bool

所以你应该这样做:

is_training = tf.placeholder(tf.bool)

# some code here

output = batch_norm(input,
                    epsilon=1e-5,
                    decay=0.9,
                    scale=True,
                    scope=scope,
                    reuse=reuse,
                    updates_collections=None,
                    is_training=is_training)
然后,在培训期间:

feed_dict = {..., is_training: True, ...}
关于推断:

feed_dict = {..., is_training: False, ...}

多亏了Dmitry,实际上我在训练期间使用了占位符(训练时设置为true,验证时设置为false),预测期间使用了常量=false。但实际情况是,预测的准确率下降到了20%(即使批量大小相同!),而培训/验证的准确率为99%,您的培训/测试时间有什么不同?您是使用相同的图表/会话,还是创建新的图表/会话?培训结束后,我保存模型。在测试时,我使用另一个会话并恢复模型。您是否发现问题?
feed_dict = {..., is_training: False, ...}