Tensorflow 凍結底層與快取凍結層

2021-09-26 05:45:21 字數 1268 閱讀 8521

首先,為什麼要凍結底層?

凍結底層是建立在一定的條件之上(條件是這兩個網路在檢測任務具有一定的相似性)。假如你要訓練乙個龐大的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 在執行之前會通過解析器解析一遍。在解...