当使用Efficientnet解压缩层时,建议将变量training设置为False(https://www.tensorflow.org/tutorials/images/transfer_learning?hl=es-419#important_note_about_batchnormalization_layers)。
所以我把它设为false
model = efficientnet.EfficientNetB1(input_shape=input_1_shape, include_top=False)
model.trainable = not freeze
x = model_trained(input_1, training=self.training_batch)
但是当更改变量时,我在调试时查看实际层,在BatchNormalization层中没有看到任何更改
在这两种情况下,它都有2个trainable_variables,2个trainable_weights和2个untrainable_variables,2个untrainable_weights。
使用Tensorflow 2.6.2
我想知道我在哪里可以看到我的更改正在应用,或者解释它实际上在更改什么,以及它是变量的实际默认值。
1条答案
按热度按时间izj3ouym1#
BatchNormalization中的训练变量基于以下标准影响层是否将对其输入进行归一化:
1.当训练变量为True时,层将对其输入进行归一化。
1.当训练变量为False时,层将不会对其输入进行归一化。
1.训练变量的默认值为True。
唯一的内置层BatchNormalization同时具有
trainable weights
和non-trainable weights
,不太可能所有其他层都只有可训练的权重。正如在关于BN层的重要说明中提到的,包含
tf.keras.layers.BatchNormalization
的模型是一种特殊情况,在微调时应采取预防措施。当您设置
layer.trainable = False
时,BatchNormalization层将在推理模式下运行,并且**不会更新其可训练变量(以跟踪均值和方差统计),均值值在训练期间不再更新。它使用不可训练的权重来跟踪训练期间输入的均值和方差。设置
layer.trainable = False
会将所有层的权重从可训练移动到不可训练。您可以使用以下命令检查更新的可变权重:
输出:
您可以参考此链接了解更多详情。