为什么推理过程中的输出量与训练过程中的批量大小相关?

2024-05-12 22:40:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我不得不说这可能是我遇到的最奇怪的问题之一。

我正在实现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_meanmoving_variance的大小也与批量大小相关,但为什么这是可能的呢?我认为moving_mean是指整个训练人群的平均值,所以moving_variance。那为什么与批量大小有关呢?

我想在张量流中使用BN肯定有什么我不知道的。这个问题真的要把我逼疯了!我从来没有想过在tensorflow中处理这样的问题,考虑到将BN与PyTorch一起使用是多么方便!你知道吗


Tags: 数据模型过程layerstftensorflowbatchtrain
1条回答
网友
1楼 · 发布于 2024-05-12 22:40:00

问题解决了! 我读了tensorflow的源代码。根据我的理解,在tf.layers.batch_normalizationmomentum的值应该是1-1/num/u批。默认值为0.99,表示训练数据有100批时,默认值最合适。

我没有找到任何提到这一点的文件。希望这能对有同样问题的人有帮助!你知道吗

相关问题 更多 >