2016-08-14 43 views
61

從我迄今爲止收集的內容來看,有幾種不同的方法將TensorFlow圖形轉儲到文件中,然後將其加載到另一個程序中,但我一直未能找到清楚的例子/他們如何工作的信息。我已經知道是這樣的:TensorFlow從文件中保存/加載圖形

  1. 保存使用tf.train.Saver()並在以後恢復它們(source
  2. 保存模型到.pb文件並加載它放回模型變量到一個檢查點文件(.ckpt)使用tf.train.write_graph()tf.import_graph_def()source)在從.pb文件的模型
  3. 負載,再培訓,以及如何使用巴澤爾(source
  4. 它轉儲到一個新的.pb文件凍結圖表保存圖形和權重一起(source
  5. 使用as_graph_def()保存模型,併爲權重/變量,它們映射到常數(source

不過,我一直無法清理有關這些不同的方法幾個問題:

  1. 關於檢查點文件,他們只保存模型的訓練權重嗎?檢查點文件是否可以加載到一個新的程序中,並且可以用來運行模型,或者它們只是作爲在特定時間/階段保存模型中權重的方法?
  2. 關於tf.train.write_graph(),還保存了權重/變量嗎?
  3. 關於Bazel,它只能保存到/從.pb文件加載再培訓?有沒有簡單的Bazel命令只是將圖轉儲到.pb中?
  4. 關於凍結,可以使用tf.import_graph_def()加載凍結圖嗎?
  5. TensorFlow的Android演示從.pb文件加載到Google的Inception模型中。如果我想替換自己的.pb文件,我會怎麼做呢?我需要更改任何本機代碼/方法嗎?
  6. 一般來說,所有這些方法之間究竟有什麼區別?或者更廣泛地說,as_graph_def() /.ckpt/.pb有什麼區別?

總之,我正在尋找的是一種方法來保存一個圖形(如在,各種操作等)及其權重/變量到一個文件,然後可以用來加載圖形和權重到另一個程序中,以供使用(不一定是繼續/再訓練)。

有關此主題的文檔不是非常簡單,所以任何答案/信息將不勝感激。

+2

最新/最完整的API是元圖,它可以讓您一次保存所有三個元素 - 1)圖2)參數值3)集合:https://www.tensorflow。 org/versions/r0.10/how_tos/meta_graph/index.html –

回答

53

有很多方法可以解決在TensorFlow中保存模型的問題,這可能會讓它有點混亂。以您的每個子問題反過來:

  1. 檢查點文件(由tf.train.Saver對象調用saver.save()例如生產)只包含的權重,並且在相同程序中定義的任何其它變量。要在另一個程序中使用它們,您必須重新創建關聯的圖形結構(例如通過運行代碼來重新構建它,或者調用tf.import_graph_def()),它告訴TensorFlow如何處理這些權重。請注意,調用saver.save()還會生成一個文件,其中包含MetaGraphDef,其中包含一個圖形以及如何將檢查點的權重與該圖形相關聯的詳細信息。有關更多詳細信息,請參閱the tutorial

  2. tf.train.write_graph()只寫圖結構;而不是權重。

  3. Bazel與閱讀或編寫TensorFlow圖無關。 (也許我誤解了你的問題:可以在評論中澄清它。)

  4. 凍結圖可以使用tf.import_graph_def()加載。在這種情況下,權重(通常)嵌入圖中,因此您不需要加載單獨的檢查點。

  5. 主要變化是更新饋入模型的張量的名稱以及從模型中提取的張量的名稱。在TensorFlow Android演示中,這將對應於傳遞到TensorFlowClassifier.initializeTensorFlow()inputNameoutputName字符串。

  6. GraphDef是程序結構,它通常不會通過培訓過程進行更改。檢查點是訓練過程狀態的快照,通常在訓練過程的每一步都會發生變化。因此,TensorFlow針對這些類型的數據使用不同的存儲格式,而低級API提供了不同的方式來保存和加載它們。更高級別的庫(如MetaGraphDef庫,Kerasskflow)基於這些機制提供更便捷的方式來保存和恢復整個模型。

+0

這是否意味着[C++ API文檔](https://www.tensorflow.org/versions/r0.11/api_docs/cc/index.html )的謊言,當它說你可以加載'tf.train.write_graph()'保存的圖形,然後執行它? – mnicky

+2

C++ API文檔沒有說謊,但缺少一些細節。最重要的細節是,除了由'tf.train.write_graph()'保存的'GraphDef'外,還需要記住執行圖時要提供和提取的張量的名稱(項目5以上)。 – mrry

+0

@mrry:我嘗試使用tensorflows DeepDream示例。但它似乎需要pb格式的預訓練模型! 我跑了Cifar10的例子,但它只創建檢查點!我無法找到任何pb文件或任何!我如何將我的檢查點轉換爲deepdream示例使用的pb格式? – Breeze