簡體   English   中英

深拷貝一個keras model到python

[英]Make a deep copy of a keras model in python

我想對我的 keras model (稱為model1 )進行深度復制,以便能夠在 for 循環中使用它,然后為每個 for 循環迭代重新初始化,並使用一個額外的樣本執行fit model。自從執行fit后,我希望能夠在每次迭代后初始化 model(但是我的 model 已修改,我希望它保持原樣,當我使用 load_weights 從路徑加載時)。

我的代碼看起來像:

model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')

model_copy= create_Model()
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')

model_copy= keras.models.clone_model(model1)
for j in range(0, image_size):
      model_copy.fit(sample[j], sample_lbl[j])
      prediction= model_copy.predict(sample[j])

此外,每次在 for 循環中加載 model 對我來說並不是很有效,因為這很耗時。 在我的案例中,我該如何正確地進行深層復制? 我發布的代碼給出了以下錯誤,涉及 function.fit 和我的參考 model model_copy:

RuntimeError: 你必須在訓練/測試之前編譯一個 model。 使用model.compile(optimizer, loss)

這些天是微不足道的:

model2 = tf.keras.models.clone_model(model1)

這將為您提供新模型、新層和新權重。 如果由於某種原因不起作用(我還沒有測試過),這個舊的解決方案將:

model1 = Model(...)
model1.compile(...)
model1.save(savepath) # saves compiled state
model2 = keras.models.load_model(savepath)

問題是在克隆之后可能沒有編譯model_copy。 事實上有一些問題:

  1. 顯然克隆不會復制損失函數,優化器信息等。

  2. 在編譯之前,您還需要構建模型。

  3. 此外,克隆不會復制重量

所以克隆后你需要額外的幾行。 例如,對於10個輸入變量:

model_copy= keras.models.clone_model(model1)
model_copy.build((None, 10)) # replace 10 with number of variables in input layer
model_copy.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model_copy.set_weights(model.get_weights())


更簡單的方法1:從文件加載權重

如果我正確理解您的問題,有一種更簡單的方法可以做到這一點。 您不需要克隆模型,只需要保存old_weights並在循環開始時設置權重。 您可以直接從文件加載權重。

for _ in range(10):
    model1= create_Model()
    model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
    model1.load_weights('my_weights')

    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])

更簡單的方法2:從之前的get_weights()加載權重

或者如果您不想從文件加載:

model1= create_Model()
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model1.load_weights('my_weights')
old_weights = model1.get_weights()

for _ in range(10):
    model1.set_weights(old_weights)
    for j in range(0, image_size):
          model1.fit(sample[j], sample_lbl[j])
          prediction= model1.predict(sample[j])

在 python 中獲取深層副本的一種非常通用的方法是從copy deepcopy進行深度復制:

import copy
model2=copy.deepcopy(model)

將它用於 keras 模型有什么缺點嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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