簡體   English   中英

TensorFlow檢查點保存並讀取

[英]TensorFlow checkpoint save and read

我有一個基於TensorFlow的神經網絡和一組變量。

培訓功能如下:

def train(load = True, step)
    """
    Defining the neural network is skipped here
    """

    train_step = tf.train.AdamOptimizer(1e-4).minimize(mse)
    # Saver
    saver = tf.train.Saver()

    if not load:
        # Initalizing variables
        sess.run(tf.initialize_all_variables())
    else:
        saver.restore(sess, 'Variables/map.ckpt')
        print 'Model Restored!'

    # Perform stochastic gradient descent
    for i in xrange(step):
        train_step.run(feed_dict = {x: train, y_: label})

    # Save model
    save_path = saver.save(sess, 'Variables/map.ckpt')
    print 'Model saved in file: ', save_path
    print 'Training Done!'

我正在調用這樣的訓練函數:

# First train
train(False, 1)
# Following train
for i in xrange(10):
    train(True, 10)

我做了這種培訓,因為我需要將不同的數據集提供給我的模型。 但是,如果我以這種方式調用train函數,TensorFlow將生成錯誤消息,指示它無法從文件中讀取已保存的模型。

經過一些實驗,我發現這是因為檢查點保存很慢。 在將文件寫入磁盤之前,下一個列車功能將開始讀取,從而產生錯誤。

我曾嘗試使用time.sleep()函數在每次調用之間做一些延遲,但它不起作用。

任何人都知道如何解決這種寫/讀錯誤? 非常感謝你!

您的代碼中存在一個微妙的問題:每次調用train()函數時,對於所有模型變量和神經網絡的其余部分,更多節點將添加到同一TensorFlow圖中。 這意味着每次構造tf.train.Saver() ,它都包含之前調用train()所有變量。 每次重新創建模型時,都會使用額外的_N后綴創建變量,以便為它們提供唯一的名稱:

  1. 使用變量var_avar_b構造Saver。
  2. 使用變量var_avar_bvar_a_1var_b_1
  3. 使用變量var_avar_bvar_a_1var_b_1var_a_2var_b_2
  4. 等等

tf.train.Saver的默認行為是將每個變量與相應op的名稱相關聯。 這意味着var_a_1不會從var_a初始化,因為它們最終會有不同的名稱。

解決方案是每次調用train()時創建一個新圖形。 修復它的最簡單方法是更改​​主程序,為每次調用train()創建一個新圖形,如下所示:

# First train
with tf.Graph().as_default():
    train(False, 1)

# Following train
for i in xrange(10):
    with tf.Graph().as_default():
        train(True, 10)

...或者,等效地,您可以在train()函數內移動with塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM