tensorflow - 如果层被冻结但 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 提供一些指导吗?
解决方案
批量归一化为每一层添加两个可训练参数,因此归一化的输出乘以“标准差”参数(gamma)并添加“均值”参数(beta)
当您设置training = False
这意味着批次标准化层将使用其内部存储的均值和方差的平均值来标准化批次(如在推理模式下),而不是批次自身的均值和方差。当 training = False 时,这些内部变量也不会更新。由于它们被初始化为均值 = 0 和方差 = 1,这意味着批归一化被有效地关闭 - 层减去零并将结果除以 1。
如果您打开批量归一化training = True
,它将开始对它们内部的批次进行归一化并收集每个批次的均值和方差的移动平均值。
推荐阅读
- sql - SQL 查询将多行返回到我的应用程序
- firebase - 在离子中如何读取和显示来自firestore的信息
- google-apps-script - 使用 Google Apps 脚本登录 Twitter
- javascript - 对列表中的每个对象进行 api 调用
- angular - 如何关闭 mouseover 和 mouseout 事件中的错误
- language-agnostic - 将游戏逻辑与渲染线程分离
- javascript - 你好。我想降低 java 脚本中按钮到顶部的滚动速度。任何人都可以帮助我吗?
- datetime - Hive 中的高效日期案例逻辑
- python - 使用 cuda 在 pytorch 1.0 上训练 frcnn:分段错误(核心转储)
- vba - 总连续天数。我怎么知道 Date+1 是否存在?