1 回答

TA貢獻1786條經驗 獲得超13個贊
在模型轉換的情況下提供最小的可重現示例當然很困難,但是這些問題將受益于更好的指針。
如果你有一個“凍結圖”(其中
tf.Graph
?變量已變成常量)
(粗體突出部分是我的)。顯然,您的圖表包含VarHandleOp
(這同樣適用于Variable
和VariableV2
節點),并且根據此定義并未“凍結”。您的一般方法是有意義的,但您需要一個圖表,其中包含節點形式的變量的實際訓練值Const
。您在訓練時需要變量,但在推理時需要變量,并且應該將其烘焙到圖中。TFLite 作為推理時間框架,不支持變量。
你的其余想法似乎不錯。TFLiteConverter.from_concrete_functions
目前正好需要 1?concrete_function
,但這就是您通過包裝圖表得到的結果。如果運氣足夠好,它可能會起作用。
有一個實用程序tensorflow/python/tools/freeze_graph.py
會盡力用從最新檢查點文件中獲取的常量替換 Graph.pb 中的變量。如果您查看其代碼,可以使用保存的元圖 (?checkpoint_name?.meta ) 文件或將工具指向訓練目錄,從而消除大量猜測;另外,我認為提供模型目錄是獲得單個凍結圖和分片模型的唯一方法。
我注意到您在示例中input
使用了 just 。tf.nest.map_structure(import_graph.as_graph_element, inputs)
您可能有其他原因,但如果您這樣做是因為as_graph_element
抱怨數據類型/形狀,則可以通過正確凍結圖形來解決這個問題。從凍結圖中獲得的具體函數將對其輸入形狀和數據類型有一個很好的了解。一般來說,需要手動設置它們是出乎意料的,而且你這樣做的事實對我來說似乎很奇怪(但我并不聲稱對 TF 的這個黑暗角落有廣泛的經驗)。
map_structure
有一個關鍵字參數來跳過檢查。
添加回答
舉報