TensorFlow Lite模型生成以及bazel的安裝使用、出現的問題及解決方案整合
2018.03.12
前提
由於要完成一個專案的原因,開始查詢將tensorflow模型轉換成lite格式,但是網上資料相對較少,又有一些細節沒寫,我作為一個新手實在是吃力,花了一個多星期,終於生成成功,以此記錄總結一下,請多多指教。
我原先的模型是有tensorflow 的 /tensorflow-master/tensorflow/examples/image_retraining/retrain.py 生成的mobilenet的模型處理的分類問題。
一、瞭解Lite生成所需步驟
網上大致找了一下資料,具體說來,tflite檔案的生成大致分為3步:
在演算法訓練的指令碼中儲存圖模型檔案(GraphDef)和變數檔案(CheckPoint)。
利用freeze_graph工具生成frozen的graphdef檔案。
利用toco工具,生成最終的tflite檔案。
二、bazel的安裝、使用及碰到的坑(血淚史)
如果你想自己生成workspace或是build的話,可用如下命令完成:
mkdir tensorflow
cd tensorflow
touch WORKSPACE (或touch BUILD)
相信大家瞭解了bazel中workspace和build之間的關係之後再去執行bazel生成lite的命令的時候就輕鬆很多了,只剩最後的執行了。
以下是有截圖的部分:
1.在輸入構建目標時:
bazel build //tensorflow/contrib/lite/toco:toco
出現如下問題:
1.
解決方法。改成輸入:
bazel build -c opt --copt=-msse4 //tensorflow/contrib/lite/toco:toco
問題解決。
2.想要檢視.pb檔案的輸入輸出節點名稱時,輸入:
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=mobilenet_v1_1.0_224_frozen.pb
總是出現如下問題:
最後發現是因為“in_graph”後面應該是.pb的絕對路徑,改完就可以了。
3.在構建執行最後的bazel-bin時,輸入為:
bazel-bin/tensorflow/contrib/lite/toco/toco input_file=zhunbei/frozen_graph.pb output_file=zhunbei/mobilenet_v1_224.tflite input_format=TENSORFLOW_GRAPHDEF output_format=TFLITE inference_type=QUANTIZED_UINT8 input_shape=1,224,224,3 input_array=input output_array=MobilenetV1/Predictions/Reshape_1
一直出現如下錯誤
2018-03-12 21:22:10.971385: W tensorflow/contrib/lite/toco/toco_cmdline_flags.cc:177] --input_type is deprecated. Use --inference_input_type.
2018-03-12 21:22:10.971433: F tensorflow/contrib/lite/toco/toco.cc:46] Check failed: parsed_toco_flags.input_file.specified() Missing required flag: input_file
已放棄 (核心已轉儲)
bazel-bin/tensorflow/contrib/lite/toco/toco --input_file=zhunbei/frozen_graph.pb --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --output_file=/tmp/mobilenet_v1_1.0_224.lite --inference_type=FLOAT --input_type=FLOAT --input_arrays=input --output_arrays=MobilenetV1/Predictions/Reshape_1 --input_shapes=1,224,224,3
則最終.lite檔案生成成功!!!!總共歷時了一個多星期!
不過還有個問題,我記得那個檔案裡說過float型別的的lite檔案不能在移動端執行,只有quant型別的才可以,但是由於這幾天查詢的內容太多了目前找不到,等我確定了再與大家共享。