gpt4 book ai didi

python - Keras Transfer-Learning 设置 layers.trainable 为 True 无效

转载 作者:行者123 更新时间:2023-12-05 06:52:19 26 4
gpt4 key购买 nike

我想使用 tf.keras (tensorflow 2.3) 微调 efficientnet,但我无法正确更改层的训练状态。我的模型如下所示:

data_augmentation_layers = tf.keras.Sequential([
keras.layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
keras.layers.experimental.preprocessing.RandomRotation(0.8)])

efficientnet = EfficientNetB3(weights="imagenet", include_top=False,
input_shape=(*img_size, 3))

#Setting to not trainable as described in the standard keras FAQ
efficientnet.trainable = False

inputs = keras.layers.Input(shape=(*img_size, 3))
augmented = augmentation_layers(inputs)
base = efficientnet(augmented, training=False)
pooling = keras.layers.GlobalAveragePooling2D()(base)
outputs = keras.layers.Dense(5, activation="softmax")(pooling)

model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(loss="categorical_crossentropy", optimizer=keras_opt, metrics=["categorical_accuracy"])

这样做是为了让我在自定义顶部的随机权重不会尽快破坏权重。

    Model: "functional_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 512, 512, 3)] 0
_________________________________________________________________
sequential (Sequential) (None, 512, 512, 3) 0
_________________________________________________________________
efficientnetb3 (Functional) (None, 16, 16, 1536) 10783535
_________________________________________________________________
global_average_pooling2d (Gl (None, 1536) 0
_________________________________________________________________
dense (Dense) (None, 5) 7685
=================================================================
Total params: 10,791,220
Trainable params: 7,685
Non-trainable params: 10,783,535

到目前为止一切似乎都正常。我训练我的模型 2 个时期,然后我想开始微调 efficientnet 基础。因此我调用

for l in model.get_layer("efficientnetb3").layers:
if not isinstance(l, keras.layers.BatchNormalization):
l.trainable = True

model.compile(loss="categorical_crossentropy", optimizer=keras_opt, metrics=["categorical_accuracy"])

我重新编译并再次打印摘要,发现不可训练权重的数量保持不变。此外,贴合不会带来比保持冷冻更好的效果。

 dense (Dense)                (None, 5)                 7685      
=================================================================
Total params: 10,791,220
Trainable params: 7,685
Non-trainable params: 10,783,535

Ps: 我也试过 efficientnet3.trainable = True 但这也没有效果。

难道这与我同时使用顺序模型和函数模型有关吗?

最佳答案

对我来说,问题在于对部分模型使用顺序 API。当我更改为顺序时,我的 model.sumary() 显示了所有子层,并且可以将其中一些设置为可训练,而另一些则不可。

关于python - Keras Transfer-Learning 设置 layers.trainable 为 True 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65994128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com