簡體   English   中英

TensorFlow:如何以及為何使用SavedModel

[英]TensorFlow: How and why to use SavedModel

我有一些關於SavedModel API的問題,我找到的文檔留下了很多細節無法解釋。

前三個問題是什么傳遞到的參數add_meta_graph_and_variables()的方法tf.saved_model.builder.SavedModelBuilder ,而第四個問題是關於為什么使用SavedModel超過API tf.train.Saver

  1. signature_def_map參數的格式是什么? 保存模型時,我通常需要設置此參數嗎?

  2. 同樣, assets_collection參數的格式是什么?

  3. 為什么要保存帶有元圖的標簽列表而不是只給它一個名字(即只附加一個唯一標簽)? 為什么我要為給定的元圖添加多個標簽? 如果我嘗試通過某個標記從pb加載metagrpah,但該pb中的多個元圖與該標記匹配怎么辦?

  4. 該文檔認為,建議使用SavedModel在自包含文件中保存整個模型(而不僅僅是變量)。 但是除了.meta文件中的變量之外, tf.train.Saver還會保存圖形。 那么使用SavedModel什么好處? 文件說

當您想要保存和加載變量,圖形和圖形的元數據時 - 基本上,當您想要保存或恢復模型時 - 我們建議使用SavedModel。 SavedModel是一種語言中立的,可恢復的,密集的序列化格式。 SavedModel支持更高級別的系統和工具來生成,使用和轉換TensorFlow模型。

但這個解釋很抽象,並沒有真正幫助我理解SavedModel的優點。 什么是SavedModel (而不是tf.train.Saver )更好用的具體例子?

請注意,我的問題與此問題不重復。 我不是在問如何保存模型,我問的是有關SavedModel屬性的非常具體的問題,這只是TensorFlow為保存和加載模型提供的多種機制之一。 鏈接問題中的所有答案都沒有觸及SavedModel API(再一次,它與tf.train.Saver )。

編輯 :我在TensorFlow 1.4上寫了這篇文章。 截至今天(TensorFlow 1.12穩定,1.13rc和2.0即將來臨)問題中鏈接的文檔得到了很大改善。


我正在嘗試使用tf.saved_model ,並且發現Docs非常(太)抽象。 這是我對你的問題的完整答案的刺:

signature_def_map

一種。 格式請參閱Tom對Tensorflow的回答:如何保存/恢復模型 Ctrl-F表示“tf.saved_model” - 目前,該問題上該短語的唯一用途是在他的回答中)。

需要我的理解是你通常需要它。 如果您打算使用該模型,則需要知道圖形的輸入和輸出。 我認為它類似於C ++函數簽名:如果您打算在調用函數或在另一個C ++文件中定義函數,則需要在主文件中簽名(即原型或頭文件)。

2. assets_collection

格式:找不到清晰的文檔,所以我去了構建器源代碼 看來該參數是dtype=tf.string的迭代,其中每個Tensor是資產目錄的路徑。 因此,TensorFlow Graph集合應該可以工作。 我猜這是參數的同名,但從源代碼我希望Python list可以工作。

(你沒有問過你是否需要設置它,但是根據Zoe對tensorflow中什么是資產的回答來判斷 iga對切向相關的Tensorflow服務的回答:“在導出模型時沒有資產可以保存/寫入” ,它沒有'通常需要設置。)

3.標簽:

一種。 為什么列表我不知道為什么你必須傳遞一個列表,但你可以傳遞一個包含一個元素的列表。 例如,在我當前的項目中,我只使用[tf...tag_constants.SERVING]標簽。

何時使用多個 Say您正在使用顯式設備放置進行操作。 也許你想保存圖形的CPU版本和GPU版本。 顯然你想保存每個服務版本,並說你想保存訓練檢查點。 您可以使用CPU / GPU標簽和培訓/服務標簽來管理所有案例。 文檔暗示它:

添加到SavedModel的每個MetaGraphDef必須使用用戶指定的標記進行注釋。 標簽提供了一種方法來識別要加載和恢復的特定MetaGraphDef,以及共享的變量和資產集。 這些標簽通常使用其功能(例如,服務或培訓)以及可選地具有硬件特定方面(例如,GPU)來注釋MetaGraphDef。

C。 碰撞太懶了我自己強迫碰撞 - 我看到兩個需要解決的案例 - 我去了加載器源代碼 def load ,你會看到:

saved_model = _parse_saved_model(export_dir)
found_match = False
for meta_graph_def in saved_model.meta_graphs:
  if set(meta_graph_def.meta_info_def.tags) == set(tags):
    meta_graph_def_to_load = meta_graph_def
    found_match = True
    break

if not found_match:
  raise RuntimeError(
      "MetaGraphDef associated with tags " + str(tags).strip("[]") +
      " could not be found in SavedModel. To inspect available tag-sets in"
      " the SavedModel, please use the SavedModel CLI: `saved_model_cli`"
  )

在我看來,它正在尋找完全匹配。 例如,假設你有一個帶有“GPU”和“Serving”標簽的元圖和一個帶有“Serving”標簽的元圖。 如果你加載“服務”,你將得到后一個元圖。 另一方面,假設你有一個元圖“GPU”和“服務”以及元圖“CPU”和“服務”。 如果您嘗試加載“服務”,您將收到錯誤。 如果您嘗試在同一文件夾中保存兩個具有完全相同標簽的元圖,我希望您將覆蓋第一個。 它看起來不像構建代碼以任何特殊方式處理這種沖突。

4. SavedModeltf.train.Saver

這也讓我很困惑。 wicke的回答是否TensorFlow用戶更喜歡SavedModel而不是Checkpoint或GraphDef? 為我清理了一下。 我會投入兩分錢:

在本地Python + TensorFlow的范圍內,您可以使tf.train.Saver完成所有操作。 但是,它會花費你。 讓我概述一下save-a-trained-model-deploy用例。 你需要你的保護對象。 最簡單的方法是將其設置為保存完整的圖形(每個變量)。 由於您使用的是靜態圖形,因此您可能不希望一直保存.meta 您需要在訓練鈎中指定它。 你可以在cv-tricks上閱讀這些內容。 培訓結束后,您需要將檢查點文件轉換為pb文件。 這通常意味着清除當前圖形,恢復檢查點,使用tf.python.framework.graph_util將變量凍結為常量,並使用tf.gfile.GFile 你可以在媒體上閱讀。 之后,您希望在Python中部署它。 您將需要輸入和輸出Tensor名稱 - 圖表def中的字符串名稱。 您可以在metaflow上閱讀相關內容(實際上是tf.train.Saver方法的一篇非常好的博客文章) 某些操作節點可以讓您輕松地將數據輸入其中。 有些不是那么多。 我通常放棄尋找合適的節點並添加一個tf.reshape ,它實際上沒有重塑任何圖形def。 那是我的ad-hoc輸入節點。 輸出相同。 最后,您可以部署模型,至少在Python本地部署。

或者,您可以使用我在第1點中鏈接的答案來使用SavedModel API完成所有這些SavedModel 由於湯姆的回答,減少了頭痛。 如果適當記錄,您將在未來獲得更多支持和功能。 看起來使用命令行服務更容易(中等鏈接覆蓋了Saver這樣做 - 看起來很難,祝你好運!)。 它實際上已經融入了新的Estimators。 根據文件,

SavedModel是一種語言中立的 ,可恢復的,密集的序列化格式。

強調我的:看起來你可以更容易地將訓練有素的模型放入不斷增長的C ++ API中。

我看待它的方式,就像數據集API。 它比舊的方式更容易

至於SavedModeltf.train.Saver具體示例:如果“基本上,當你想保存或恢復你的模型時”對你來說還不夠清楚:正確的使用時間是它讓你的生活更輕松。 對我來說,這看起來總是如此。 特別是如果您使用Estimators,在C ++中部署或使用命令行服務。

這就是我對你的問題的研究。 或者四個列舉的問題。 呃,八個問號。 希望這可以幫助。

暫無
暫無

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

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