首页 > 解决方案 > 如果层被冻结但 is_training 为真,BatchNorm 是否会在 Tensorflow 中进行训练?

问题描述

我正在尝试执行一些迁移学习,其中我必须冻结我的相关模型的前几层,并且只使用不同的数据集微调最后几层。

我知道,如果我们不冻结任何东西,我们只需在训练期间将 is_training 设置为 True,在测试期间将 is_training 设置为 false。但是现在我想知道如果我将冻结层从可训练变量中排除并且 is_training 为 True,Batch-norm 的行为会是什么样子。

为了冻结层“A”、“B”和“C”,我做了这样的事情:

tvars = tf.contrib.framework.filter_variables(tf.trainable_variables(), exclude_patterns = ['A', 'B', 'C'])
grad = optimizer.comput_gradient(some_loss, tvars)

但我不确定在训练期间应该如何设置“is_training”……据我了解,BatchNorm 有 2 个可训练变量“gamma”和“beta”。如果我真的希望冻结“A”、“B”、“C”,我需要为它们禁用更新操作。但是,在迁移学习期间仍然需要更新均值和方差,对吗?

我是迁移学习的新手,任何人都可以就如何处理 Tensorflow 中的冻结层的 Batch norm 提供一些指导吗?

标签: tensorflowconv-neural-networktransfer-learningbatch-normalizationpre-trained-model

解决方案


批量归一化为每一层添加两个可训练参数,因此归一化的输出乘以“标准差”参数(gamma)并添加“均值”参数(beta)

当您设置training = False这意味着批次标准化层将使用其内部存储的均值和方差的平均值来标准化批次(如在推理模式下),而不是批次自身的均值和方差。当 training = False 时,这些内部变量也不会更新。由于它们被初始化为均值 = 0 和方差 = 1,这意味着批归一化被有效地关闭 - 层减去零并将结果除以 1。

如果您打开批量归一化training = True,它将开始对它们内部的批次进行归一化并收集每个批次的均值和方差的移动平均值。


推荐阅读