想運行TuriCreate,卻沒有蘋果電腦,也沒有Linux使用經驗,怎么辦?用上這款云端應用,讓你免安裝Python運行環境。一分錢不用花,以高性能GPU,輕松玩兒轉深度學習。
痛點
《如何用Python和深度神經網絡識別圖像?》一文發布后,收到了很多讀者的留言。大家對從前印象中高不可攀的深度神經網絡圖片識別來了興趣,都打算親自動手,試用一下簡單易用的TuriCreate框架。
有的讀者嘗試之后,很開心。
有的讀者卻遇到了問題:
我在《如何用Python和深度神經網絡尋找近似圖片?》一文中,對這個疑問做了回應——TuriCreate目前支持的操作系統有限,只包括如下選項:
如果你用的操作系統是Windows 7及以下版本,目前TuriCreate還不支持。
解決辦法有兩種:
第一種,升級到Windows 10,并且使用WSL。
第二種,采用虛擬機安裝好Linux。
這兩種解決方法好不好?
不好。
它們都是沒有辦法的辦法。
因為都需要用戶接觸到Linux這個新系統。
對于IT專業人士來說,Linux確實是個好東西。
首先,它免費。因此可以把軟硬件的綜合使用成本降到最低;
其次,它靈活。從系統內核到各種應用,你都可以隨心所欲定制。不像Windows或者macOS,管你用不用西班牙語和文本語音朗讀功能,統統默認一股腦給你裝上;
第三,它結實。Linux雖然免費,但是從創生出來就是以UNIX作為參考對象,完全可以勝任運行在一年都不關機一回的大型服務器上。
但是,Linux這些優點,放到我專欄的主要閱讀群體——“文科生”——那里,就不一定是什么好事兒了。
因為Linux的學習曲線,很陡峭。
所以,如果你固執地堅持在自己的電腦上運行TuriCreate,又不愿意學Linux,那可能就得去買臺Macbook了。
但是,誰說運行代碼一定要在自己的機器上呢?
云端
你可以把TuriCreate安裝在云端——只要云端的主機是Linux就好。
你可能怒了,覺得我是在戲耍你——我要是會用Linux,就直接本地安裝了!本地的Linux我都不會用,還讓我遠程使用Linux?!你什么意思嘛?
別著急,聽我把話說完。
云端的Linux主機,大多是只給你提供個操作系統,你可以在上面自由安裝軟件,執行命令。
這樣的云端系統,往往需要你具備相當程度的IT專業知識,才能輕松駕馭。
更要命的是,這種租用來的云主機,要么功能很弱,要么很貴。
那種幾十塊錢一個月的主機,往往只有一個CPU核心。跑深度學習項目?只怕你還沒獲得結果,別人的論文都發出來了。
有沒有高性能主機?當然有。
例如亞馬遜的AWS,就提供了p2.xlarge這樣的配置供你選擇。有了它,運行深度學習任務游刃有余。
但是它很貴。
有人計算過,如果你需要長期使用深度學習功能,還是本地組裝一臺高性能電腦比較劃算。
另外,雖然亞馬遜已經幫你做了很多準備工作。你從開始折騰這臺云主機到真正熟練掌握使用,還是要花些功夫。
從網上找一篇靠譜的教程后,經過自己的反復實踐,不斷求助,最終你會掌握以下技能:
- 硬件配置含義;
- 云平臺信用卡支付方式;
- 控制面板使用;
- 計費原理;
- 競價規則;
- 實例使用限制;
- 定制實例類型選擇;
- 安全規則設定;
- 公鑰私鑰的使用;
- 加密通訊ssh連接;
- 文件權限設定;
- 其他……
了解了如何最省錢地運行高配置AWS虛擬主機,知道該在何時啟動和關閉實例。一個月下來,你看著賬單上的金額如此之少,會特別有成就感吧。
問題是,你最初是想要干什么來著?
你好像只是打算把手頭的照片,利用TuriCreate上的卷積神經網絡快速做個分類模型出來吧?
所以,這種折騰不是正道。
在某些時刻,做出正確的選擇比盲目付出努力重要得多。
你應該選擇一個云平臺,它得具有如下特色:
你不必會Linux,也不用從頭裝一堆基礎軟件。打開就能用,需要哪個額外的功能,一條指令就搞定。提供高性能GPU用來運行深度學習代碼……最好還免費。
你是不是覺得我在做夢?猶豫著要不要趕緊喊我醒過來?
這不是做夢,真的有這樣的好事兒。
發現
本文推薦給你的云運行環境,是由Google提供的Colaboratory,下文簡稱Colab。
其實這個工具已經存在了好幾年了。
最初版本由Google和Jupyter團隊合作開發。只是最近才迭代到漸入佳境的狀態。經過這篇Medium文章的推廣,吸引了很多研究者和學習者的關注。
官方的介紹是:
Colaboratory 是一款研究工具,用于進行機器學習培訓和研究。它是一個 Jupyter 筆記本環境,不需要進行任何設置就可以使用。
請用Google Chrome瀏覽器打開這個鏈接,你可以看到這份“Colaboratory簡介”。
雖然外觀不同,但是它實際上就是一份Jupyter Notebook筆記本。
我們嘗試運行一下其中的語句。
注意這個筆記本里面的語句,其實是Python 2格式。但是默認筆記本的運行環境,是Python 3。
所以,如果你直接執行第一句(依然是用Shift+Enter),會報錯。
解決辦法非常簡單,打開上方工具欄中的“代碼執行程序”標簽頁。
選擇最下方的“更改運行時類型”。
將默認的Python 3改成Python 2之后,點擊右下角的保存按鈕。
然后我們重新運行第一個代碼區塊的語句。這次就能正常輸出了。
語句區塊2就更有意思了。它直接調用Google自家的深度學習框架——tensorflow軟件包。
我曾經專門為tensorflow的安裝寫過教程。但是在這里,你根本就沒有安裝tensorflow,它卻實實在在為你工作了。
不僅是tensorflow,許多常用的數據分析工具包,例如numpy, matplotlib都默認安裝好了。
對于這些基礎工具,你一概不需要安裝、配置、管理,只要拿過來使用就行。
我們運行最后一個代碼單元。
看,圖片輸出都毫無問題。
編程環境領域的即插即用?。√袅?!
可是興奮過后,你可能覺得不過如此——這些軟件包,我本地機器都正確安裝了。執行起來,再怎么說也是本地更方便一些啊。
沒錯。
但是安裝TuriCreate時,你的Windows操作系統不支持,對不對?
下面我為你展示如何用Colab運行TuriCreate,進行深度學習。
數據
我把需要分類的圖像數據以及ipynb文件都放到了這個github項目中。請點擊這個鏈接下載壓縮包。
下載后解壓到本地硬盤。
可以看到,其中包含一個ipynb文件和一個image目錄。
image目錄內容,就是你之前在《如何用Python和深度神經網絡尋找近似圖片?》一文中已經見過的哆啦a夢和瓦力的圖片。
這是藍胖子的圖片:
這是瓦力的圖片:
請用Google Chrome瀏覽器(目前Colab尚不支持其他瀏覽器)打開這個鏈接,開啟你的Google Drive。
當然,如果你還沒有Google賬號,需要注冊一個,然后登錄使用。
下面,把你剛剛解壓的那個文件夾拖拽到Google Drive的頁面上,系統自動幫你上傳。
上傳完成后,在Google Drive里打開這個文件夾。
在demo_python_image_classification.ipynb
文件上單擊鼠標右鍵。選擇打開方式為Colaboratory。
Colab打開后的ipynb文件如下圖所示。
我們首先需要確定運行環境。點擊菜單欄里面的“修改”,選擇其中的“筆記本設置”。
確認運行時類型為Python 2,硬件加速器為GPU。如果不是這樣的設置,請修改。然后點擊保存。
數據有了,環境也已配置好。下面我們正式開始運行代碼了。
代碼
我們嘗試讀入TuriCreate軟件包。
import turicreate as tc
結果會有如下報錯。
遇到這個報錯很正常。
因為我們還沒有安裝TuriCreate。
不是說不需要安裝深度學習框架嗎?
那得看是誰家的深度學習框架了。
Colab默認安裝Tensorflow,因為它是Google自家開發的深度學習框架。
而TuriCreate是蘋果的產品,所以需要咱們手動安裝。
手動安裝很麻煩嗎?
才不會。
新開一個代碼單元,然后輸入以下一行語句:
!pip install turicreate
你就可以看到Colab幫你辛勤地安裝TuriCreate以及全部依賴包了,根本不用自己操心。瞬間就安裝好了。
我們重新調用TuriCreate。
import turicreate as tc
這次成功執行,再沒有出現報錯。
下面我們需要做一件事情,就是讓Colab可以從我們的數據文件夾里面讀取內容。
可是默認狀態下,Colab根本就不知道我們的數據文件夾在哪里——即便我們本來就是從Google Drive的演示文件夾下面打開這個ipynb文件的。
我們首先要讓Colab找到Google Drive的根目錄。
這原本是一個相對復雜的問題。但是好在我們有現成的代碼,可以拿來使用。
請執行下面這個單元格的代碼。看不懂不要擔心。因為你不需要調整其中的任何語句。
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
執行剛開始,你會看到下面的運行狀態。
過了一小會兒,你會發現程序停了下來。給你一個鏈接,讓你點擊。并且囑咐你把獲得的結果填入下面的文本框。
點擊鏈接,你會看到下圖。
點擊你自己的Google賬號。
然后會提示你Google Cloud SDK的權限請求。
點擊允許后,你就獲得了一長串字符了。復制它們。
回到Colab頁面上,把這一長串字符粘貼進去,回車。
你可能認為運行完畢。不對,還需要第二步驗證。
又出來了一個鏈接。
點擊之后,還是讓你選擇賬號。
然后Google Cloud SDK又提出了權限要求。注意和上次的請求權限數量不一樣。
你需要再復制另外的一串新字符。
粘貼回去,回車。這次終于執行完畢。
好了,現在Colab已經接管了你的Google Drive了。我們給Google Drive云端硬盤的根目錄起個名字,叫做drive。
!mkdir -p drive
!google-drive-ocamlfuse drive
然后,我們告訴Colab,請把我們當前的工作目錄設定為Google Drive下的demo-python-image-classification-Google-colab-master文件夾。
import os
os.chdir("drive/demo-python-image-classification-Google-colab-master/")
好了,準備工作完畢,我們繼續。
我們需要告訴TuriCreate,圖像數據文件夾在哪里。
img_folder = 'image'
然后,我們讀入全部圖像文件到數據框data。
data = tc.image_analysis.load_images(img_folder, with_path=True)
這里,你會發現讀入速度比較慢。這確實是個問題,是否是因為TuriCreate的SFrame數據框在Colab上有些水土不服?目前我還不能確定。
好在咱們樣例中的文件總數不多,還能接受。
終于讀取完畢了。
我們看看data中包含哪些數據吧。
data
跟Jupyter Notebook本地運行結果一致,都是文件路徑,以及圖片的尺寸信息。
下面,我們還是給圖片打標記。
來自哆啦a夢文件夾的,標記為doraemon;否則標記為walle。
data['label'] = data['path'].apply(lambda path: 'doraemon' if 'doraemon' in path else 'walle')
再看看data數據框內容。
data
可見,標記已經成功打好。
我們嘗試用explore()
函數瀏覽data數據框,查看圖片。
data.explore()
但是很不幸,TuriCreate提示我們,該功能暫時只支持macOS.
別忘了,我們現在使用的,是Linux操作系統,所以無法正常使用explore()
函數。不過這只是暫時的,將來說不定哪天就支持了。
幸好,這個功能跟我們的圖像分類任務關系不大。我們繼續。
把數據分成訓練集與測試集,我們使用統一的隨機種子取值,以保證咱們獲得的結果可重復驗證。
train_data, test_data = data.random_split(0.8, seed=2)
下面我們正式建立并且訓練模型。
model = tc.image_classifier.create(train_data, target='label')
運行的時候,你會發現,原本需要很長時間進行的預訓練模型參數下載,居然瞬間就能完成。
這是怎么回事兒?作為思考題,留給你自行探索解答。給你一個小提示:云存儲。
TuriCreate自動幫我們處理了圖像尺寸歸一化,并且進行了多輪迭代,尋找合適的超參數設置結果。
好了,我們嘗試用訓練集生成的模型,在測試集上面預測一番。
predictions = model.predict(test_data)
預測結果如何?我們用evaluate()
函數來做個檢驗。
metrics = model.evaluate(test_data)
print(metrics['accuracy'])
結果如下:
0.935483870968
我們看看預測的結果:
predictions
dtype: str
Rows: 31
['doraemon', 'walle', 'walle', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle']
再看看實際的標記:
test_data['label']
dtype: str
Rows: 31
['walle', 'walle', 'walle', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle']
兩相比對,我們希望找出那些錯誤預測的圖片存儲位置:
test_data[test_data['label'] != predictions]['path']
下面我們需要直觀瀏覽一下預測錯誤的圖像。
讀入Jupyter的Image模塊,用于展示圖像。
from IPython.display import Image
我們先來展示第一幅圖像:
Image(test_data[test_data['label'] != predictions]['path'][0])
結果如下:
還是老樣子,50層的深度神經網絡模型,已經無法讓人直觀理解。所以我們無法確切查明究竟是哪個判定環節上出了問題。
然而直觀猜測,我們發現在整個照片里,方方正正的瓦力根本就不占主要位置。反倒是圓頭圓腦的機器人成了主角。這樣一來,給圖片形成了比較嚴重的噪聲。
我們再來看看另一幅圖:
Image(test_data[test_data['label'] != predictions]['path'][1])
結果是這樣的:
這幅圖里面,同樣存在大量的干擾信息,而且就連哆啦a夢也做了海盜cosplay。
好了,到這里,我們的代碼遷移到Colab工作順利完成。
如你所見,我們不需要在本地安裝任何軟件包。只用了一個瀏覽器和一個從github下載的文件夾,就完成了TuriCreate深度學習的(幾乎)全部功能。
比起虛擬機安裝Linux,或者自己設定云端Linux主機,是不是輕松多了呢?
小結
通過閱讀本文,希望你已經掌握了以下知識點:
- 某些深度學習框架,例如TuriCreate,會有平臺依賴;
- 除了本地安裝開發環境外,云端平臺也是一種選擇;
- 選擇云端平臺時,特別要注意設置的簡便性與性價比;
- 如何將數據和代碼通過Google Drive遷移到Colab中;
- 如何在Colab中安裝缺失的軟件包;
- 如何讓Colab找到數據文件路徑。
另外,請你在為需求選擇工具的時候,記住哈佛大學營銷學教授萊維特(Theodore Levitt)的那句經典名言:
人們其實不想買一個1/4英寸的鉆頭。他們只想要一個1/4英寸的洞。
這句話不僅對學習者和開發者有用。
對于產品的提供者,意義只怕更為重大。
討論
你之前正確安裝了TuriCreate了嗎?用的什么操作系統?你嘗試過在云端運行Python代碼嗎?有沒有比Colab更好的云端代碼運行環境?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
喜歡請點贊。還可以微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)。
如果你對數據科學感興趣,不妨閱讀我的系列教程索引貼《如何高效入門數據科學?》,里面還有更多的有趣問題及解法。