【问题标题】:Will BatchNorm be trained in Tensorflow if layers get frozen but is_training is True?如果层被冻结但 is_training 为真,BatchNorm 会在 Tensorflow 中进行训练吗?
【发布时间】:2020-03-02 19:09:15
【问题描述】:

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

我知道,如果我们不冻结任何东西,我们只需在训练期间将 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 的指导?

【问题讨论】:

    标签: tensorflow conv-neural-network transfer-learning batch-normalization pre-trained-model


    【解决方案1】:

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

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

    如果您使用training = True 启用批次标准化,它将开始对批次内部进行标准化并收集每个批次的均值和方差的移动平均值。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多