想執行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)。
如果你對資料科學感興趣,不妨閱讀我的系列教程索引貼《如何高效入門資料科學?》,裡面還有更多的有趣問題及解法。