[英]How to set parameters in keras to be non-trainable?
我是 Keras 的新手,正在構建模型。 我想在訓練前幾層的同時凍結模型最后幾層的權重。 我試圖將橫向模型的可訓練屬性設置為 False,但它似乎不起作用。 這是代碼和模型摘要:
opt = optimizers.Adam(1e-3)
domain_layers = self._build_domain_regressor()
domain_layers.trainble = False
feature_extrator = self._build_common()
img_inputs = Input(shape=(160, 160, 3))
conv_out = feature_extrator(img_inputs)
domain_label = domain_layers(conv_out)
self.domain_regressor = Model(img_inputs, domain_label)
self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])
self.domain_regressor.summary()
模型摘要:模型摘要。
如您所見, model_1
是可訓練的。 但是根據代碼,它被設置為不可訓練。
您可以簡單地為圖層屬性trainable
分配一個布爾值。
model.layers[n].trainable = False
您可以可視化哪個層是可訓練的:
for l in model.layers:
print(l.name, l.trainable)
您也可以通過模型定義傳遞它:
frozen_layer = Dense(32, trainable=False)
從 Keras文檔:
“凍結”一個層意味着將它從訓練中排除,即它的權重永遠不會更新。 這在微調模型或對文本輸入使用固定嵌入的上下文中很有用。
您可以將可訓練參數(布爾值)傳遞給層構造函數以將層設置為不可訓練。 此外,您可以在實例化后將圖層的可訓練屬性設置為 True 或 False。 要使此生效,您需要在修改可訓練屬性后對模型調用 compile()。
單詞“trainble”中有一個拼寫錯誤(缺少一個“a”)。 可悲的是,keras 沒有警告我該模型沒有“trainble”屬性。 這個問題可以結束了。
盡管原始問題的解決方案是一個錯字修復,但讓我添加一些關於 keras 可訓練的信息。
現代 Keras 包含以下用於查看和操作可訓練狀態的工具:
tf.keras.Layer._get_trainable_state()
函數 - 打印字典,其中鍵是模型組件,值是布爾值。 請注意, tf.keras.Model
也是tf.Keras.Layer
。tf.keras.Layer.trainable
屬性 - 操縱各個層的可訓練狀態。因此,典型的操作如下所示:
# Print current trainable map:
print(model._get_trainable_state())
# Set every layer to be non-trainable:
for k,v in model._get_trainable_state().items():
k.trainable = False
# Don't forget to re-compile the model
model.compile(...)
更改代碼中的最后 3 行:
last_few_layers = 20 #number of the last few layers to freeze
self.domain_regressor = Model(img_inputs, domain_label)
for layer in model.layers[:-last_few_layers]:
layer.trainable = False
self.domain_regressor.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.