2017-06-22 175 views
4

我想加載預先訓練的模型(由AdadeltaOptimizer優化)並繼續使用SGD(GradientDescentOptimizer)進行培訓。該模型被保存,加載tensorlayer APITensorflow加載預先訓練的模型使用不同的優化器

保存模型:

import tensorlayer as tl 
tl.files.save_npz(network.all_params, 
        name=model_dir + "model-%d.npz" % global_step) 

負荷模型:

load_params = tl.files.load_npz(path=resume_dir + '/', name=model_name) 
tl.files.assign_params(sess, load_params, network) 

如果我繼續adadelta培訓,培訓的損失(交叉熵)看起來正常(作爲加載的模型開始接近值)。但是,如果我將優化器更改爲SGD,則培訓損失將與新初始化的模型一樣大。

我看了一下tl.files.save_npzmodel-xxx.npz文件。它只會將所有模型參數保存爲ndarray。我不確定優化程序或學習率如何涉及此處。

回答

1

您可能不得不將張量導入變量中,該變量是損失函數/交叉熵,它饋送給您的Adam優化器以前的。現在,只需通過您的SGD優化器提供它。

saver = tf.train.import_meta_graph('filename.meta') 
saver.restore(sess,tf.train.latest_checkpoint('./')) 
graph = tf.get_default_graph() 
cross_entropy = graph.get_tensor_by_name("entropy:0") #Tensor to import 

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) 

在這種情況下,我已標記的訓練我pretrain模型名稱entropy前交叉熵張量,因此

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv), name = 'entropy') 

如果您無法更改您的pretrain模型,您可以從中獲取模型中的張量列表(導入之後),並推導出您需要的張量。我對Tensorlayer沒有經驗,所以本指南提供了更多的理解。你可以看看Tensorlayer-Layers,他們應該解釋如何獲得你的張量。由於Tensorlayer建立在Tensorflow之上,大部分功能仍然可用。

+0

感謝您的回答。但我很困惑,爲什麼我必須導入張量,「它計算以前在Adam Optimizer上的損失」。無論優化器如何,在相同的模型參數下,損失應該是相同的,對吧? –

+0

我對我的答案做了修改,希望這個更清楚。實際上,我只是將優化器的類型從Adam更改爲SGD。 –

0

您可以指定要保存在檢查點文件中的參數。

save_npz([save_list, name, sess]) 

save_list你指定唯一不包含的優化參數,因此沒有學習率或任何其他優化參數的網絡參數。

如果你想保存當前學習率(以使用完全相同的學習速度在恢復模式),你必須把它添加到save_list,這樣的:

save_npz(network.all_params.extend([learning_rate]) 

(我suppoose是all_params是一個數組,我想我的假設是正確的。

既然你想改變優化,我建議你保存learning_rate僅作爲優化參數,而不是任何其他變量的優化造成的。 以這種方式,你將能夠改變優化器並恢復模型,否則(如果您將任何其他變量放入您的檢查點),您嘗試恢復的圖形將無法找到保存的值所在的變量,您將無法更改它。

+0

面對我只保存了'network.all_params',它不包含adadelta創建的任何其他變量,對嗎?我也沒有保存學習率,但在恢復模型後爲SGD分配初始學習率。 –

相關問題