iOS 中的TensorFlow

對(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)行 看效果了

F6C51097-1A46-4120-A73C-1BBD976E90BC.png

創(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,添加如下打包文件:
打包文件.png
b) 配置Header Search Patchs 路徑

在 Build Settings -> Header Search Patchs ,依次輸入如下路徑

header search 文件配置.png

這個(gè)地方我使用了一個(gè)偷工減料的方法,在之前下載的 TensorFlow 文件中找到指定的文件,拖拽到這個(gè)地方,自動(dòng)生成的路徑,編譯的時(shí)候即可查找到

c) 配置Other Linker Flags 路徑

在 Build Settings -> Other Linker Flags ,依次輸入如下路徑

Other Linker Flags.png

這些配置好之后就可以編譯.a靜態(tài)庫使用了

第二步: 運(yùn)行引入 TensorFlow 的.a靜態(tài)庫的自定義 demo
a) 創(chuàng)建工程TensorFlowDemo,把需要的文件導(dǎo)入進(jìn)去,如下:
TensorFlowDemo.png
b) 導(dǎo)入需要的 framework,如下
framework.png
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市景殷,隨后出現(xiàn)的幾起案子溅呢,更是在濱河造成了極大的恐慌澡屡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐旧,死亡現(xiàn)場離奇詭異驶鹉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铣墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門室埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伊约,你說我怎么就攤上這事姚淆。” “怎么了屡律?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵腌逢,是天一觀的道長。 經(jīng)常有香客問我超埋,道長搏讶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任霍殴,我火速辦了婚禮媒惕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘繁成。我一直安慰自己吓笙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布巾腕。 她就那樣靜靜地躺著,像睡著了一般絮蒿。 火紅的嫁衣襯著肌膚如雪尊搬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天土涝,我揣著相機(jī)與錄音佛寿,去河邊找鬼。 笑死但壮,一個(gè)胖子當(dāng)著我的面吹牛冀泻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜡饵,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弹渔,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了溯祸?” 一聲冷哼從身側(cè)響起肢专,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤舞肆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后博杖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椿胯,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剃根,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哩盲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狈醉,死狀恐怖廉油,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舔糖,我是刑警寧澤娱两,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站金吗,受9級(jí)特大地震影響十兢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摇庙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一旱物、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卫袒,春花似錦宵呛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至码秉,卻和暖如春盅称,著一層夾襖步出監(jiān)牢的瞬間厘肮,已是汗流浹背电爹。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工诞外, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人府蔗。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓晋控,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姓赤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赡译,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容