簡體   English   中英

如何將 keras 中的參數設置為不可訓練?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM