我正在嘗試調試tflite使用自定義操作的模型。我找到了 op 名稱 (in *.pb) 和 op ids (in *.tflite)之間的對應關系,并且我正在逐層進行比較(以確保輸出差異始終在范圍內1e-4(因為它最終會爆炸) ,我想找到我的自定義層失敗的確切位置)如下:方法一:我get_tensor用來獲取輸出如下:from tensorflow.contrib.lite.python import interpreter# load the modelmodel = interpreter.Interpreter(model_path='model.tflite')model.allocate_tensors()# get tensorsfor i in tensor_ids: tensor_output[i] = model.get_tensor(i)它顯示出完全不足的隨機值(與 TensorFlow 模型的輸出相比)。方法二:*.pb只轉換到某一層,然后重復,基本上:創建一個*.pb,使其僅包含從input到的網絡layer_1。轉換為tflite(因此輸出現在為layer_1)并使用 TensorFlow 檢查 TF-Lite 的輸出。對layer_2, layer_3, ...重復步驟 1-2 outputs。這種方法需要更多的工作和執行,但它正確地表明,對于內置操作tflite,pb模型的輸出是相同的,只是在我的自定義操作中開始有所不同(而在方法 1 中,輸出立即與第一層不同) .問題:為什么 的行為get_tensor如此奇怪?也許是因為我正在使用tensorflow 1.9(當時 TF-Lite 還沒有發布并且僅在開發者預覽版中可用)?PS:我知道 TF-Lite 的發布,但我已經為我的項目手動編譯了 TensorFlow 1.9,現在很難更改版本控制。
3 回答

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
是的,除非指定為輸出,否則可以覆蓋中間張量。
編輯:我設法通過在轉換過程中將所有操作都放在輸出列表中來解決這個問題。然后在運行時保留它們,并且可以正確讀取這些值。

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
我在想將 TFLite 文件轉換為另一個框架時遇到了類似的問題,但無法訪問用于制作 TFLite 文件的原始 TF 圖。因為我的轉換輸出與 TFLite 模型的輸出不同,所以我想查看中間層的輸出。感謝這個關于 SO 的話題,我了解到這get_tensor()
不是一個可靠的方法。
最簡單的解決方案是在十六進制編輯器中編輯 TFLite 文件!
模型的輸出是模型中張量之一的索引。在我的例子中,張量是 175(你可以用 看到它get_tensor_details()
。它作為小端 int32 存儲在 TFLite 文件的某處。對于張量 175,TFLite 值將包含一個值 0xAF000000。
我希望模型輸出使用張量 3,所以我在十六進制編輯器中打開了 TFLite 文件,搜索了 0xAF000000,并將其替換為 0x03000000。保存文件并使用 TFLite 解釋器再次加載它。奇跡般有效。您只需要注意該文件可能包含不止一次出現的 0xAF000000(或您要查找的任何內容)。在我的 TFLite 文件中,它存儲在末尾。
我希望這個提示對某人有用。:-)
添加回答
舉報
0/150
提交
取消