我不得不说这可能是我遇到的最奇怪的问题之一。
我正在实现ResNet,用tensorflow对cifr-10进行10分类。训练阶段一切似乎都很好——损失稳步下降,训练集的准确率不断提高到90%以上,但在推理过程中,结果完全不正常。
我已经非常仔细地分析了我的代码,排除了在输入数据或保存/加载模型时出错的可能性。因此,训练阶段和测试阶段的唯一区别在于批处理规范化层。你知道吗
对于BN层,我直接使用了tf.layers.batch_normalization
,我想我已经注意到了使用tf.layers.batch_normalization
时的每一个陷阱。你知道吗
具体来说,我包含了train_op
的依赖项,如下所示
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
self.train_op = optimizer.minimize(self.losses)
另外,为了保存和加载模型,我将var_list
指定为tf.global_variables()
。此外,我使用training=True
进行训练,training=False
进行测试。
尽管如此,推理过程中的准确率只有10%左右,即使应用于用于训练的相同数据。当我输出网络的最后一层(即输入到softmax的10维向量)时,我发现在训练过程中,10维向量中每一项的大小总是1e0或1e-1,而在推理中,它可能是1e4甚至1e5。最奇怪的是,我发现10维向量在推理过程中的大小与训练中使用的批大小相关,即批大小越大,大小越小。
此外,我还发现BN层的moving_mean
和moving_variance
的大小也与批量大小相关,但为什么这是可能的呢?我认为moving_mean
是指整个训练人群的平均值,所以moving_variance
。那为什么与批量大小有关呢?
我想在张量流中使用BN肯定有什么我不知道的。这个问题真的要把我逼疯了!我从来没有想过在tensorflow中处理这样的问题,考虑到将BN与PyTorch一起使用是多么方便!你知道吗
问题解决了! 我读了tensorflow的源代码。根据我的理解,在
tf.layers.batch_normalization
中momentum
的值应该是1-1/num/u批。默认值为0.99,表示训练数据有100批时,默认值最合适。我没有找到任何提到这一点的文件。希望这能对有同样问题的人有帮助!你知道吗
相关问题 更多 >
编程相关推荐