Pok*_*eLu 4 python keras tensorflow batch-normalization tf.keras
根据tensorflow官方文档:
关于在`BatchNormalization层上设置layer.trainable = False:
设置layer.trainable = False的含义是冻结该层,即其内部状态在训练期间不会改变:其可训练权重不会在fit()或train_on_batch(),其状态更新将不会运行。
通常,这并不一定意味着该层在推理模式下运行(通常由调用层时可以传递的训练参数控制)。“冻结状态”和“推理模式”是两个独立的概念。
然而,对于 BatchNormalization 层,在该层上设置 trainable = False 意味着该层随后将在推理模式下运行(意味着它将使用移动均值和移动方差来标准化当前批次,而不是使用当前批次的均值和方差)。
此行为已在 TensorFlow 2.0 中引入,以便使 layer.trainable = False 能够在卷积网络微调用例中产生最常见的预期行为。
我不太理解概念中的术语“冻结状态”和“推理模式”。我尝试通过将 设为 False 进行微调trainable,但发现移动均值和移动方差没有更新。
所以我有以下问题:
What's the difference between 2 attributes training and trainable?
可训练:-(如果为真)它基本上意味着参数(层)的“可训练”权重将在反向传播中更新。
训练:-某些层在训练和推理(或测试)步骤中的表现不同。一些示例包括 Dropout Layer、Batch-Normalization 层。所以这个属性告诉层它应该以什么方式执行。
Is gamma and beta getting updated in the training process if set trainable to false?
由于 gamma 和 beta 是 BN 层的“可训练”参数,因此如果 set trainable 设置为“False”,它们将不会在训练过程中更新。
Why is it necessary to set trainable to false when fine-tuning?
在进行微调时,我们首先在顶部添加我们自己的分类 FC 层,该层是随机初始化的,但我们的“预训练”模型已经针对该任务进行了校准(有点)。
打个比方,这样想。
您有一条从 0 到 10 的数轴。在该数轴上,“0”代表完全随机模型,而“10”代表一种完美模型。我们的预训练模型约为 5、6 或 7,即很可能比随机模型更好。我们在顶部添加的 FC 层位于“0”,因为它在开始时是随机的。
我们为预训练模型设置trainable = False,这样可以使FC层快速达到预训练模型的水平,即具有更高的学习率。如果我们不为预训练模型设置 trainable = False 并使用更高的学习率,那么它将造成严重破坏。
所以最初,我们为预训练模型设置较高的学习率和trainable = False并训练FC层。之后,我们解冻预训练模型并使用非常低的学习率来达到我们的目的。
如果需要,请自由要求更多说明,如果您觉得有帮助,请投票。