對(duì)于iOS平臺(tái)下如何使用TensorFlow,TensorFlow給出了詳細(xì)的編譯腳本命令驾窟,詳情請(qǐng)查看官方文檔的命令。
下面簡單介紹下我運(yùn)行 TensorFlow 的過程,以及遇到的坑:
編譯+運(yùn)行官方 demo
第一步:官網(wǎng)下載 TensorFlow,
地址https://github.com/tensorflow/tensorflow
因?yàn)?TensorFlow 包含各個(gè)平臺(tái),所以比較大
第二步:編譯腳本build_all_ios.sh
TensorFlow文件夾tensorflow/contrib/makefile/目錄下的build_all_ios.sh腳本是用來編譯iOS靜態(tài)庫的腳本十饥,因此可以直接執(zhí)行此腳本巩步。開始靜態(tài)庫的編譯工作,
進(jìn)入makefile 文件夾,終端輸入 ./build_all_ios.sh 就會(huì)自動(dòng)編譯腳本,這個(gè)編譯需要的時(shí)間比較久,編譯完成之后功咒,會(huì)在tensorflow/contrib/makefile目錄下回看到新增兩個(gè)文件downloads 和gen
第三步:運(yùn)行官方 demo
TensorFlow文件夾tensorflow/contrib/makefile/ios_examples 下面是官方給的三個(gè) demo,如果編譯成功,不需要任何修改就可以直接運(yùn)行 看效果了
創(chuàng)建自己的 demo引入 TensorFlow
運(yùn)行官方的 demo, 以及下載別人的 demo 查看,都需要配置相對(duì)路徑,操作步驟正如官網(wǎng)說明,這種配置很有局限性,這只能說明TensorFlow 目前很不成熟,沒有專門的 靜態(tài)庫,如果引用到自己項(xiàng)目中,使用靜態(tài)庫比較方便些,下面就簡單介紹下,我自己創(chuàng)建的 demo
第一步:打包 TensorFlow 的.a靜態(tài)庫
如果不會(huì)打包.a靜態(tài)庫,之前也寫了一篇文章介紹(http://www.reibang.com/p/a3af01018298)
a) 創(chuàng)建一個(gè)工程PictureCheck,添加如下打包文件:
b) 配置Header Search Patchs 路徑
在 Build Settings -> Header Search Patchs ,依次輸入如下路徑
這個(gè)地方我使用了一個(gè)偷工減料的方法,在之前下載的 TensorFlow 文件中找到指定的文件,拖拽到這個(gè)地方,自動(dòng)生成的路徑,編譯的時(shí)候即可查找到
c) 配置Other Linker Flags 路徑
在 Build Settings -> Other Linker Flags ,依次輸入如下路徑
這些配置好之后就可以編譯.a靜態(tài)庫使用了
第二步: 運(yùn)行引入 TensorFlow 的.a靜態(tài)庫的自定義 demo
a) 創(chuàng)建工程TensorFlowDemo,把需要的文件導(dǎo)入進(jìn)去,如下:
b) 導(dǎo)入需要的 framework,如下
c)其它設(shè)置
? 在Xcode中工程信息配置頁面愉阎,點(diǎn)擊Build Settings
選項(xiàng)卡 --> Enable Bitcode 設(shè)置:
Enable Bitcode: No
? 在Xcode中工程信息配置頁面,點(diǎn)擊Build Settings
選項(xiàng)卡 ,關(guān)閉警告力奋,否則在你編譯應(yīng)用程序時(shí)榜旦,會(huì)有很多警告!!
Warnings / Documentation Comments: No
Warnings / Deprecated Functions: No
bug 總結(jié)(嵌入自己的模型文件)
a) No OpKernel was registered to support Op 'Maximum' with these attrs. Registered devices: [CPU], Registered kernels: device='CPU'; T in [DT_FLOAT]
[[Node: gradients/Mean_grad/Maximum = Maximum[T=DT_INT32, _output_shapes=[[]], _device="/device:CPU:0"](gradients/Mean_grad/Prod_1, gradients/Mean_grad/Maximum/y)]]
這個(gè)問題困擾很久,也多虧這個(gè)問題,把 TensorFlow 的 issues 幾乎看了個(gè)遍,又把 TensorFlow 中的 Makefile 文件的邏輯理清楚了,過程很痛苦,最后不用我們解決,模型文件有問題
b) 這個(gè)問題沒有截圖,報(bào)的錯(cuò)誤是Initialize 相關(guān)的錯(cuò)誤.解決方法就是:tf_op_files.txt
文件里面多添加一個(gè)tensorflow/core/kernels/random_op.cc
操作.
參考鏈接 https://github.com/tensorflow/tensorflow/search?l=C%2B%2B&q=TruncatedNormal&type=&utf8=?
c) No OpKernel was registered to support Op 'Switch' with these attrs. Registered devices: [CPU], Registered kernels:
device='GPU'; T in [DT_FLOAT]
device='GPU'; T in [DT_INT32]
device='GPU'; T in [DT_BOOL]
device='GPU'; T in [DT_STRING]
device='CPU'; T in [DT_INT32]
device='CPU'; T in [DT_FLOAT]
[[Node: dropout6/cond/Switch = Switch[T=DT_BOOL](Placeholder_2, Placeholder_2)]]
tensorflow/core/framework /register.h
文件,第125行 #define TF_CALL_bool(m)
改為#define TF_CALL_bool(m) m(bool)
附上解決的鏈接https://stackoverflow.com/questions/40855271/no-opkernel-was-registered-to-support-op-switch-with-these-attrs-on-ios/43627334 ,只想說這個(gè)人真的好厲害.
項(xiàng)目還在繼續(xù),有問題還會(huì)繼續(xù)記錄,中間的坑很多,記錄一下,一方面方便大家學(xué)習(xí)交流,另一個(gè)方面記錄成長.
附上 demo : https://github.com/StarRain-L/TensorFlowDemo
參考鏈接:
? https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile
? https://www.jiqizhixin.com/articles/343751f0-9709-42a8-9a81-297b9ec00456
? http://blog.csdn.net/Tencent_Bugly/article/details/72828569?locationNum=16&fps=1
? http://www.reibang.com/p/cba9142f964b