keras - 如何判断我是否已在 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
解决方案
但是,我不确定这是否真的发生了,因为控制台的输出并不表明发生了什么。
确实如此,从可训练参数的数量可以看出。正如预期的那样,只有最后一个 Dense 层的参数(5125)是可训练的。
Total params: 7,042,629
Trainable params: 5,125
Non-trainable params: 7,037,504
推荐阅读
- google-colaboratory - 如何在 google colab 中编辑 .py 文件?
- javascript - 说“rxjs observable”在 promise 没有的地方需要多个是什么意思
- c - 如何根据另一个序列(按升序排序的浮点数组)重新排列 char 数组?
- encryption - 使用 CryptoJS 解码(Base64)和解密(AES/CBC/PKCS5PADDING) - React
- machine-learning - 如何使用 seq2seq 解码连接的字符串
- jsf - 如何为 JSF 实现一个好的转换器?
- javascript - Node.js 与 Python 中的剩余部分
- python - Quandl 返回的 Numpy 数据中的三个点
- mysql - 错误“无法启动 mariadb.service:未找到单元 mariadb.service”
- reactjs - 使用 React 状态来允许临时无效的数字输入