簡體   English   中英

tf.train.Saver-在不同的機器上加載最新的檢查點

[英]tf.train.Saver - Load latest checkpoint on different machine

我有一個訓練有素的模型,已使用tf.train.Saver保存了該模型,並生成了4個相關文件

  • checkpoint
  • model_iter-315000.data-00000-of-00001
  • model_iter-315000.index
  • model_iter-315000.meta

現在,由於它是通過docker容器生成的,因此機器本身和docker上的路徑是不同的,就像我們在兩台不同的機器上工作一樣。

我正在嘗試將保存的模型加載到容器外部。

當我運行以下內容時

sess = tf.Session()
saver = tf.train.import_meta_graph('path_to_.meta_file_on_new_machine')  # Works
saver.restore(sess, tf.train.latest_checkpoint('path_to_ckpt_dir_on_new_machine')  # Fails

錯誤是

tensorflow.python.framework.errors_impl.NotFoundError: PATH_ON_OLD_MACHINE ; 沒有相應的文件和目錄

即使我在調用tf.train.latest_checkpoint時提供了新路徑, tf.train.latest_checkpoint出現錯誤,該錯誤會在舊路徑上顯示該路徑。

我該如何解決?

“檢查點”文件是一個索引文件,它本身具有嵌入的路徑。 在文本編輯器中將其打開,然后將路徑更改為正確的新路徑。

或者,使用tf.train.load_checkpoint()加載特定的檢查點,而不依賴TensorFlow為您找到最新的檢查點。 在這種情況下,它不會引用“檢查點”文件,並且不同的路徑也不會成為問題。

或編寫一個小的腳本來修改“檢查點”的內容。

如果打開checkpoint文件,您將看到類似以下內容:

model_checkpoint_path: "/PATH/ON/OLD/MACHINE/model.ckpt-315000"
all_model_checkpoint_paths: "/PATH/ON/OLD/MACHINE/model.ckpt-300000"
all_model_checkpoint_paths: "/PATH/ON/OLD/MACHINE/model.ckpt-285000"
[...]

只需刪除/PATH/ON/OLD/MACHINE/ ,或將其替換為/PATH/ON/NEW/MACHINE/ ,就可以了。

編輯 :將來,在創建tf.train.Saver ,應使用save_relative_paths選項。 引用文檔

save_relative_paths :如果為True,則將相對路徑寫入檢查點狀態文件。 如果用戶要復制檢查點目錄並從復制的目錄重新加載,則需要這樣做。

這是一種不需要編輯檢查點文件或手動查看檢查點目錄內部的方法。 如果我們知道檢查點前綴的名稱,則可以使用regex和tensorflow在checkpoint文件的第一行中寫入最新檢查點的假設:

import tensorflow as tf
import os
import re


def latest_checkpoint(ckpt_dir, ckpt_prefix="model.ckpt", return_relative=True):
    if return_relative:
        with open(os.path.join(ckpt_dir, "checkpoint")) as f:
            text = f.readline()
        pattern = re.compile(re.escape(ckpt_prefix + "-") + r"[0-9]+")
        basename = pattern.findall(text)[0]
        return os.path.join(ckpt_dir, basename)
    else:
        return tf.train.latest_checkpoint(ckpt_dir)

暫無
暫無

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

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