首先,為什麼要凍結底層?
凍結底層是建立在一定的條件之上(條件是這兩個網路在檢測任務具有一定的相似性)。假如你要訓練乙個龐大的dnn網路用於分類任務,這時最為明智的做法是找乙個已經訓練好的同樣用於dnn分類網路的模型。已經訓練好的網路的模型可能已經學會了檢測影象中的低階特徵,因此這些低階特徵的檢測對於這兩個網路來說都是有用的。
凍結已訓練好的dnn的一些底層,在這些底層上進行新的dnn的訓練,是乙個非常明智的選擇。
tensorflow實現上述過程十分容易:
import tensorflow as tf
#獲得可訓練的層,凍結層排除在可訓練層之外
train_vars=tf.get_collection(tf.graphkeys.trainable_variables,scope='hidden[34]|outputs')
#獲得所有在隱藏層3,4及輸出層的可訓練變數。排除了在隱藏層1和2的變數
train_op=optimizer.minimize(loss,var_list=train_vars)
快取凍結層的含義:
基於上述的凍結層,我們已經將原有的模型的第一層與第二層進行了凍結,那麼表示他的權重並不發生變化。如果現在訓練新的網路資料仍然從第一層開始,這樣會增加很多計算的開銷,由於前兩層的權重已經不會改變了,這時明智的做法是將第二層的輸出作為新的網路的輸入。
首先,可以一次性在這兩個底層跑完全部的資料集:
hidden2_outputs=sess.run(hidden2,feed_dict=)
然後,在訓練中,批量構建上述隱藏層2的輸出(hidden2_outputs).
import numpy as np
n_epoch=100
n_batches=500
for epoch in range(n_epoch):
shuffled_idx=rnd.permutation(len(hidden2_outputs))
hidden2_batches=np.array_split(hidden2_outputs[shuffled_idx],n_batches)
y_batches=np.array_split(y_train[shuffled_idx],n_batches)
for hidden2_batch,y_batch in zip(hidden2_batches, y_batches):
sess.run(training_op,feed_dict=)
pytorch載入模型與凍結
weights torch.load path with open a.pkl wb as f pickle.dump score dict,f weights pickle.load f 直接載入 model.load state dict weights 字典生成式載入 self.load st...
凍結訓練的理解與使用
凍結訓練的作用 當我們已有部分預訓練權重,這部分預訓練權重所應用的那部分網路是通用的,如骨幹網路,那麼我們可以先凍結這部分權重的訓練,將更多的資源放在訓練後面部分的網路引數,這樣使得時間和資源利用都能得到很大改善。然後後面的網路引數訓練一段時間之後再解凍這些被凍結的部分,這時再全部一起訓練。參考知乎...
JS基礎 (1) 變數提公升與凍結
1.變數提公升 使用var定義的 會把宣告放到前面去,賦值保留在原位 var name dun function show console.log name undefined console.log name dun show 為什麼出現這樣的情況,是因為js 在執行之前會通過解析器解析一遍。在解...