训练变量如何影响tensorflow中的BatchNormalization,它的默认值是什么?

iih3973s  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(168)

当使用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
我想知道我在哪里可以看到我的更改正在应用,或者解释它实际上在更改什么,以及它是变量的实际默认值。

izj3ouym

izj3ouym1#

BatchNormalization中的训练变量基于以下标准影响层是否将对其输入进行归一化:
1.当训练变量为True时,层将对其输入进行归一化。
1.当训练变量为False时,层将不会对其输入进行归一化。
1.训练变量的默认值为True。
唯一的内置层BatchNormalization同时具有trainable weightsnon-trainable weights,不太可能所有其他层都只有可训练的权重。
正如在关于BN层的重要说明中提到的,包含tf.keras.layers.BatchNormalization的模型是一种特殊情况,在微调时应采取预防措施。
当您设置layer.trainable = False时,BatchNormalization层将在推理模式下运行,并且**不会更新其可训练变量(以跟踪均值和方差统计),均值值在训练期间不再更新。
它使用不可训练的权重来跟踪训练期间输入的均值和方差。设置layer.trainable = False会将所有层的权重从可训练移动到不可训练。
您可以使用以下命令检查更新的可变权重:

print(len(model.trainable_weights))
#print(model.trainable_weights)

print(len(model.non_trainable_weights))
#print(model.non_trainable_weights[:5])

输出:

2
260

您可以参考此链接了解更多详情。

相关问题