2017-05-11 66 views
0

我一直在研究這一段時間,似乎無法破解它。在其他問題中,我看到他們使用這些代碼示例爲了保存和恢復使用metagraph和檢查點文件的模型,但是當我做類似的事情時,它說w1未定義,當我將savemodel和restore模型分開時python文件。當我在保存部分的末尾恢復時,它可以正常工作,但它無法在一個單獨的文件中重新定義所有內容。我查看了檢查點文件,看起來奇怪,它只有兩行,它似乎沒有引用任何變量或有任何值。它只有1kb。我曾嘗試將'w1'作爲字符串放入打印函數中,而不是返回值,而是返回值。這是否適用於其他人?如果是這樣,你的檢查點文件是什麼樣的?在張量流中加載metagraph和檢查點

#Saving 
import tensorflow as tf 
w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1') 
w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2') 
saver = tf.train.Saver([w1,w2]) 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
saver.save(sess, 'my_test_model',global_step=1000) 

#restoring 
with tf.Session() as sess:  
    saver = tf.train.import_meta_graph('my_test_model-1000.meta',clear_devices=True) 
    saver.restore(sess,tf.train.latest_checkpoint('./')) 
    print sess.run(w1) 
+0

重複http://stackoverflow.com/questions/33759623/tensorflow-how-to-save-restore-a-model – hars

回答

2

您的圖保存正確,但恢復它不會恢復包含圖的節點的變量。 w1是一個python變量,你從來沒有聲明過在'恢復'部分代碼。爲了得到一個手柄上的權重,

  • 可以在TF圖形使用他們的名字:w1=get_variable(name='w1')。問題是你必須密切關注你的名字範圍,並確保你沒有多個相同名稱的變量(在這種情況下,TF爲他們的名字添加'_1',所以你可能會得到錯誤的)。如果你這樣做,張量板可以幫助你知道每個變量的確切名稱。

  • 您可以使用集合:將有趣的節點保存到集合中,並在還原後從它們中取回。在構建圖表時,在保存之前,請執行以下操作:例如:tf.add_to_collection('weights', w1)tf.add_to_collection('weights', w2),並在您的還原代碼中:[w1, w2] = tf.get_collection('weights1')。那麼你可以正常使用w1和w2。

我認爲後者雖然更詳細,但對於未來架構的變化可能會更好。我知道所有這些看起來都很冗長,但請記住,通常情況下,您不必在所有變量上取回句柄,但只有少數變量:輸入,輸出和訓練步驟通常已足夠。

+0

謝謝。我現在就試試看。你有機會知道爲什麼這個代碼片段是共享的嗎?如果它只在同一個文件中工作,它似乎不是特別有用。 –

+0

得到它的工作。只是對您的代碼進行一次小小的更正它是'tf.get_collection'而不是'tf.get_from_collection'。感謝您的幫助。我拉着頭髮不確定爲什麼它爲其他人工作,但不是我。 –

+0

我認爲舊的做事方式是重新創建圖形,然後加載檢查點,而不使用元圖。在這種情況下,您可以直接使用w1(因爲它是在您構建圖形時定義的)。我們實際上仍然可以這樣做,我忘了在我的答案中提到它。但是,當你加載它時,你仍然需要訪問圖形構建函數,並且你需要與保存的圖形完全一樣,所以它又不如當前方法強壯:如果在代碼中更改1個節點名稱實例,你將無法加載舊的ckpt ... – gdelab

相關問題