首页 > 解决方案 > 如何判断我是否已在 Keras 中成功冻结或解冻图层?

问题描述

你怎么知道你什么时候在 Keras 中成功冻结了一个层?下面是我试图冻结整个 DenseNet121 层的模型片段;但是,我不确定这是否真的发生了,因为控制台的输出并不表明发生了什么。

我尝试了两种方法 (1)densenet.trainable = False和 (2) model.layers[0].trainable = False

此外,如果我再次加载模型并添加model.layers[0].trainable = True,这会解冻图层吗?

densenet = DenseNet121(
    weights='/{}'.format(WEIGHTS_FILE_NAME),
    include_top=False,
    input_shape=(IMG_SIZE, IMG_SIZE, 3)
)

model = Sequential()
model.add(densenet)

model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(NUM_CLASSES, activation='sigmoid'))
model.summary()

# This is how I freeze my layers, I decided to do it twice because I wasn't sure if it was working
densenet.trainable = False
model.layers[0].trainable = False

history = model.fit_generator(
                    datagen.flow(x_train, y_train, batch_size=BATCH_SIZE),
                    steps_per_epoch=len(x_train) / BATCH_SIZE,
                    epochs=NUM_EPOCHS,
                    validation_data=(x_test, y_test),
                    callbacks=callbacks_list,
                    max_queue_size=2
                   )

下面是 的输出model.summary(),我希望它表明图层是否已成功冻结。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
densenet121 (Model)          (None, 8, 8, 1024)        7037504   
_________________________________________________________________
global_average_pooling2d_3 ( (None, 1024)              0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 1024)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 5125      
=================================================================
Total params: 7,042,629
Trainable params: 5,125
Non-trainable params: 7,037,504
_________________________________________________________________
Epoch 1/100
354/353 [==============================] - 203s 573ms/step - loss: 0.4374 - acc: 0.8098 - val_loss: 0.3785 - val_acc: 0.8290
val_kappa: 0.0440
Epoch 2/100
354/353 [==============================] - 199s 561ms/step - loss: 0.3738 - acc: 0.8457 - val_loss: 0.3575 - val_acc: 0.8310
val_kappa: 0.0463
Epoch 3/100

标签: keras

解决方案


但是,我不确定这是否真的发生了,因为控制台的输出并不表明发生了什么。

确实如此,从可训练参数的数量可以看出。正如预期的那样,只有最后一个 Dense 层的参数(5125)是可训练的。

Total params: 7,042,629
Trainable params: 5,125
Non-trainable params: 7,037,504

推荐阅读