人工智能、機器學習都已走進了我們的日常,尤其是愈演愈熱的大數據更是跟我們的生活息息相關,做 人工智能、數據挖掘的人在其他人眼中感覺是很高大上的,總有一種遙不可及的感覺,在我司也經常會聽到數據科學部的同事們提到 機器學習、數據挖掘 之類的詞。但這些名詞真的跟我們移動開發就沒直接關系了嗎?
作為移動開發者來說,無時無刻不被這些名詞狠狠地敲打著脆弱的內心。???? ???? ???? 何時才能夠將機器學習、深度學習應用在移動端,敲響移動端機器學習工業化的大門呢?
想象一下,某一天你身處一個完全陌生的環境,周圍都是陌生的事物,而運行在iPhone的某個APP卻對這個環境了如指掌,你要做的就是打開這個APP,輸入你需要了解的事物,iPhone告訴你這個事物的信息,你也就沒有了陌生事物了。世界就在眼前!
如下圖:
上面物體的識別准確率還是蠻不錯的,基本識別出了鍵盤(49%的概率)、鼠標(46%的概率)和水杯(24%的概率)。
但是在某些事物的識別准確度方便卻差強人意,比如下圖:
Phone 6被識別成了iPod(59%的概率),而iPod的卻是不怎麼敢認(10%的概率)。想想最崩潰的估計是iPhone 6了,身價直接被降了好幾個等級。
上面的例子來自於TensorFlow官方iOSDemo,暫且不評述TensorFlow的識別准確度如何,畢竟它還年輕,但是僅憑其識別能力的體現,也給機器學習在移動端的運用帶來了無限的可能。
一、TensorFlow(簡稱TF)
去年,Google資深系統專家Jeff Dean在灣區機器學習大會上隆重介紹了其第二代深度學習系統TensorFlow,一時間網絡上針對TensorFlow的文章鋪天蓋地,揭秘TensorFlow:Google開源到底開的是什麼?、Google開源TensorFlow系統,這背後都有什麼門道?、如何評價Google發布的第二代深度學習系統TensorFlow?等等文章,TensorFlow的燎原之火一直在燃燒蔓延著,其GitHub上的開源庫在此文撰寫時,也已經被star:27550,fork:11054了。???? ???? ???? ???? ????
不負眾望,Google一直宣稱平台移植性非常好的TensorFlow,終於在2016年6月27日,發布0.9版本,宣布移動端支持。TensorFlow v0.9 now available with improved mobile support( 有牆???? ),同時也給出了移動端的Demo,對於代碼為生的程序員,身處大數據處理為主導的TalkingData,也小試身手了一把,下載TensorFlow源碼,查看編譯指南,開始跳坑、填坑之路,也成就了此篇拙文的產生。
二、從TensorFlow到iOS靜態庫
對於iOS平台下如何使用TensorFlow,TensorFlow給出了詳細的編譯腳本命令,詳情請查看官方文檔的命令。
第一步. 工具准備
工欲善其事必先利其器,在開始編譯工作之前,需要准備一些編譯所必須的工具:
Homebrew: Mac os x 上包管理工具,具體使用方法可參考Doc。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Homebrew安裝好之後,依次安裝三個輔助性編譯工具:
$ brew install libtool $ brew install autoconf $ brew install automake
三個工具的含義,請參考:https://en.wikipedia.org/wiki/GNU_Libtool
第二步. 克隆TensorFlow
Google以Apache 2.0開源協議將TensorFlow開源在GitHub上,我們可以直接使用TensorFlow源碼。
在任意你想存放TensorFlow源碼的地方(建議不要放在桌面。^_^),clone項目。
$ git clone https://github.com/tensorflow/tensorflow
第三步. 編譯前准備
在TensorFlow的tensorflow/contrib/makefile/目錄下,有很多可使用的編譯腳本,其中build_all_ios.sh腳本專門用來一鍵編譯TensorFlow iOS靜態庫。雖然可以直接使用此腳本進行一鍵編譯,但是因為有牆,某些依賴需要提前做處理。
1、下載protobuf
protobuf 是編譯前唯一需要特殊處理的依賴庫,點擊下載,下載protobuf之後,解壓,備用。
2、下載googlemock
雖然protobuf編譯腳本autogen.sh中的googlemock鏈接地址https://googlemock.googlecode.com/files/gmock-1.7.0.zip無法直接下載到,但是細心的人會發現,在浏覽器中輸入 https://googlemock.googlecode.com/地址後,會跳轉到https://github.com/google/googlemock地址,google在GiHub上的倉庫地址。而GitHub上的倉庫,我們可以直接的下載,克隆等。
我們直接在GitHub上下載googlemock(點擊下載),下載完成後,修改壓縮包名字為gmock-1.7.0.zip,修改後將此壓縮包移至上一步protobuf文件夾目錄下,備用。
3、修改下載依賴腳本,移除protobuf的下載
在tensorflow/contrib/makefile/目錄下,download_dependencies.sh腳本用來下載相關依賴,打開此腳本文件,注釋掉或者直接刪掉git clone https://github.com/google/protobuf.git ${DOWNLOADS_DIR}/protobuf部分,目的是不讓腳本去下載protobuf。
上面三步准備好後,接下來就進入靜態庫編譯了。
第四步. 一鍵編譯
前面已經知道在TensorFlow文件夾tensorflow/contrib/makefile/目錄下的build_all_ios.sh腳本是用來編譯iOS靜態庫的腳本,因此可以直接執行此腳本,開始靜態庫的編譯工作了。
但是有一個問題大家可能會發現,由於編譯TensorFlow需要用到protobuf,但是protobuf使我們自己手動下載的,該怎麼讓手動下載的protobuf能夠直接讓build_all_ios.sh腳本使用呢?
答案是復制、粘貼。可能有些low,但是有效。執行命令 build_all_ios.sh之後,立即把之前手動下載的protobuf文件夾拷貝進tensorflow/contrib/makefile/downloads目錄。(放心,你拷貝的速度會很快,不會影響編譯的執行的。^_^)
$ build_all_ios.sh
一切准備就緒,接下來就是靜靜的等待編譯完成了。在Mac編譯的過程中,建議插上電源,最好不要讓設備休眠斷電,也最好不要去干別的東西,出去溜達一圈,回來後就看到戰果了。
編譯完成之後,會在tensorflow/contrib/makefile/gen/目錄下看到編譯的結果,關於這些靜態庫該如何使用,自己的項目如何應用,請參考TensorFlow iOS Examples。
三、遇到的問題
1、googlecode.com被牆了,需要翻牆!(目前測試掛了VPN也沒用),這也是上面編譯前准備為什麼要那麼做的原因。
curl: (7) Failed to connect to googlemock.googlecode.com port 443: Operation timed out
解決: 請參考 『第三步. 編譯前准備』。
2、沒有Xcode。
xcrun: error: SDK "iphoneos" cannot be located xcrun: error: SDK "iphoneos" cannot be located xcrun: error: unable to lookup item 'PlatformPath' in SDK 'iphoneos' + IPHONEOS_PLATFORM=
解決:安裝Xcode,從上面報錯的命令中可以看到,在編譯靜態庫的過程中使用了xcrun,而此命令是xCode本身具有的能力。
3、你的Xcode版本不是7.3或以後,或者你有多個Xcode,而默認的安裝路徑版本不是7.3或以後。
``` error: Xcode 7.3.0 or later is required.
exit 1 ```/
解決:更新Xcode至最新版本,並且保證默認路徑下是最新/版本。
如果Xcode是7.3,並且沒有條件更新Xcode,你可以修改tensorflow/contrib/makefile/compile_ios_tensorflow.sh 裡的REQUIRED_XCODE_VERSION=7.3.0,為REQUIRED_XCODE_VERSION=7.3。(這樣修改,目前還不確定會不會帶來一些其他影響,最好是升級你的Xcode)
想了解TensorFlow在Android平台的使用可以,看看 TalkingData SDK Team 另一篇的技術博客Tensorflow 在 Android 平台的移植
四、參考鏈接
TensorFlow 中文社區
TensorFlow for Mobile
Caffe、TensorFlow、MXnet三個開源庫對比
如何評價Tensorflow和其它深度學習系統
深度學習框架大戰正在進行,誰將奪取“深度學習工業標准”的榮耀?