亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

TensorFlow Lite 無法識別操作 VarHandleOp

TensorFlow Lite 無法識別操作 VarHandleOp

汪汪一只貓 2023-10-18 16:35:11
我正在嘗試將 TF 模型轉換為 TFLite。模型以 .pb格式保存,我使用以下代碼對其進行了轉換:import osimport tensorflow as tffrom tensorflow.core.protobuf import meta_graph_pb2export_dir = os.path.join('export_dir', '0')if not os.path.exists('export_dir'):    os.mkdir('export_dir')tf.compat.v1.enable_control_flow_v2()tf.compat.v1.enable_v2_tensorshape()# I took this function from a tutorial on the TF websitedef wrap_frozen_graph(graph_def, inputs, outputs):    def _imports_graph_def():        tf.compat.v1.import_graph_def(graph_def, name="")    wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])    import_graph = wrapped_import.graph    return wrapped_import.prune(            inputs, outputs)graph_def = tf.compat.v1.GraphDef()loaded = graph_def.ParseFromString(open(os.path.join(export_dir, 'saved_model.pb'),'rb').read())concrete_func = wrap_frozen_graph(        graph_def, inputs=['extern_data/placeholders/data/data:0', 'extern_data/placeholders/data/data_dim0_size:0'],    outputs=['output/output_batch_major:0'])concrete_func.inputs[0].set_shape([None, 50])concrete_func.inputs[1].set_shape([None])concrete_func.outputs[0].set_shape([None, 100])converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])converter.experimental_new_converter = Trueconverter.post_training_quantize=Trueconverter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,                                               tf.lite.OpsSet.SELECT_TF_OPS]converter.allow_custom_ops=Truetflite_model = converter.convert()# Save the model.if not os.path.exists('tflite'):    os.mkdir('tflite')output_model = os.path.join('tflite', 'model.tflite')with open(output_model, 'wb') as f:     f.write(tflite_model)現在,我在代碼中找不到任何內容VarHandleOp,我發現它實際上是在tensorflow中(https://www.tensorflow.org/api_docs/python/tf/raw_ops/VarHandleOp)。那么,為什么TFLite無法識別呢?
查看完整描述

1 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

在模型轉換的情況下提供最小的可重現示例當然很困難,但是這些問題將受益于更好的指針。

如果你有一個“凍結圖”(其中tf.Graph?變量已變成常量

(粗體突出部分是我的)。顯然,您的圖表包含VarHandleOp(這同樣適用于VariableVariableV2節點),并且根據此定義并未“凍結”。您的一般方法是有意義的,但您需要一個圖表,其中包含節點形式的變量的實際訓練值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有一個關鍵字參數來跳過檢查。


查看完整回答
反對 回復 2023-10-18
  • 1 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號