[英]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。 事實上有一些問題:
顯然克隆不會復制損失函數,優化器信息等。
在編譯之前,您還需要構建模型。
此外,克隆不會復制重量
所以克隆后你需要額外的幾行。 例如,對於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())
如果我正確理解您的問題,有一種更簡單的方法可以做到這一點。 您不需要克隆模型,只需要保存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])
或者如果您不想從文件加載:
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.