【发布时间】:2021-08-25 09:05:40
【问题描述】:
我正在关注 TensorFlow 官方网站上的Transfer learning and fine-tuning guide。它指出在微调期间,批量归一化层应该处于推理模式:
关于
BatchNormalization层的重要说明许多图像模型包含
BatchNormalization层。该层是 每个可以想象的计数的特殊情况。这里有几件事要保留 记住。
BatchNormalization包含 2 个在训练期间更新的不可训练权重。这些是跟踪输入均值和方差的变量。- 当您设置
bn_layer.trainable = False时,BatchNormalization层将在推理模式下运行,并且不会更新其均值和方差统计信息。这不是一般其他层的情况,as weight trainability & inference/training modes are two orthogonal concepts。但在BatchNormalization层的情况下,两者是并列的。- 当您解冻包含
BatchNormalization层的模型以进行微调时,您应该在调用基本模型时通过传递training=False将BatchNormalization层保持在推理模式。否则,应用于不可训练权重的更新将突然破坏模型所学的内容。您将在最后的端到端示例中看到这种模式的实际应用 本指南。
即便如此,其他一些来源,例如 this 文章(标题为使用 ResNet 进行迁移学习)说的完全不同:
for layer in resnet_model.layers: if isinstance(layer, BatchNormalization): layer.trainable = True else: layer.trainable = False
无论如何,我知道TensorFlow中的training和trainable参数是有区别的。
我正在从文件中加载我的模型,如下所示:
model = tf.keras.models.load_model(path)
我正在以这种方式解冻(或实际冻结其余部分)一些顶层:
model.trainable = True
for layer in model.layers:
if layer not in model.layers[idx:]:
layer.trainable = False
现在关于批量标准化层:我可以这样做:
for layer in model.layers:
if isinstance(layer, keras.layers.BatchNormalization):
layer.trainable = False
或
for layer in model.layers:
if layer.name.startswith('bn'):
layer.call(layer.input, training=False)
我应该做哪一个?最终冻结批规范层是否更好?
【问题讨论】:
标签: tensorflow keras neural-network tensorflow2.0 batch-normalization