神級程式設計師用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

你會發現,幾乎所有的規則定義,都需要改寫。

當機器好不容易可以用近似投機取巧的方法正確分辨了這兩張圖片裡面的動物時,我又拿出來一張新圖片……

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

幾個小時以後,你決定放棄。

彆氣餒。

你遭遇到的,並不是新問題。就連大法官,也有過同樣的煩惱。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

1964年,美國最高法院的大法官Potter Stewart在“Jacobellis v. Ohio”一案中,曾經就某部電影中出現的某種具體圖像分類問題,說過一句名言“我不準備就其概念給出簡短而明確的定義……但是,我看見的時候自然會知道”(I know it when I see it)。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

你早已聽說過自動駕駛汽車的神奇吧?沒有機器對圖像的辨識,能做到嗎?

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

不是。

計算機所做的,是學習。

通過學習足夠數量的樣本,機器可以從數據中自己構建模型。其中,可能涉及大量的判斷準則。但是,人類不需要告訴機器任何一條。它是完全自己領悟和掌握的。

你可能會覺得很興奮。

那麼,下面我來告訴你一個更令你興奮的消息——你自己也能很輕易地構建圖片分類系統!

不信?請跟著我下面的介紹,來試試看。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

解壓後,你會看到目錄下有個image文件夾,其中包含兩個子目錄,分別是doraemon和walle。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

打開其中doraemon的目錄,我們看看都有哪些圖片。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

可以看到,哆啦a夢的圖片真是五花八門。各種場景、背景顏色、表情、動作、角度……不一而足。

這些圖片,大小不一,長寬比例也各不相同。

我們再來看看瓦力,也是類似的狀況。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

數據已經有了,下面我們來準備一下環境配置。

環境

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

下載頁面區左側是Python 3.6版,右側是2.7版。請選擇2.7版本。

雙擊下載後的pkg文件,根據中文提示一步步安裝即可。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

這樣就進入到了Jupyter筆記本環境。我們新建一個Python 2筆記本。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

這樣就出現了一個空白筆記本。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

點擊左上角筆記本名稱,修改為有意義的筆記本名“demo-python-image-classification”。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

準備工作完畢,下面我們就可以開始編寫程序了。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

本例中提示,有幾個.DS_Store文件,TuriCreate不認識,無法當作圖片來讀取。

這些.DS_Store文件,是蘋果macOS系統創建的隱藏文件,用來保存目錄的自定義屬性,例如圖標位置或背景顏色。

我們忽略這些信息即可。

下面,我們來看看,data數據框裡面都有什麼。

data

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

原先打印data數據框,我們只能看到圖片的尺寸,此時卻可以瀏覽圖片的內容。

如果你覺得圖片太小,沒關係。把鼠標懸停在某張縮略圖上面,就可以看到大圖。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

可以看到,幾個輪次下來,不論是訓練的準確度,還是驗證的準確度,都已經非常高了。

下面,我們用獲得的圖片分類模型,來對測試集做預測。

predictions = model.predict(test_data)

我們把預測的結果(一系列圖片對應的標記序列)存入了predictions變量。

然後,我們讓TuriCreate告訴我們,在測試集上,我們的模型表現如何。

先別急著往下看,猜猜結果正確率大概是多少?從0到1之間,猜測一個數字。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

我們發現,在31個測試數據中,只有1處標記預測發生了失誤。原始的標記是瓦力,我們的模型預測結果是哆啦a夢。

我們獲得這個數據點對應的原始文件路徑。

wrong_pred_img_path = test_data[predictions != test_data['label']][0]['path']

然後,我們把圖像讀取到img變量。

img = tc.Image(wrong_pred_img_path)

用TuriCreate提供的show()函數,我們查看一下這張圖片的內容。

img.show()

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

因為深度學習的一個問題在於模型過於複雜,所以我們無法精確判別機器是怎麼錯誤辨識這張圖的。但是我們不難發現這張圖片有些特徵——除了瓦力以外,還有另外一個機器人。

如果你看過這部電影,應該知道兩個機器人之間的關係。這裡我們按下不表。問題在於,這個右上方的機器人圓頭圓腦,看上去與稜角分明的瓦力差別很大。但是,別忘了,哆啦a夢也是圓頭圓腦的。

原理

按照上面一節的代碼執行後,你應該已經瞭解如何構建自己的圖片分類系統了。在沒有任何原理知識的情況下,你研製的這個模型已經做得非常棒了。不是嗎?

如果你對原理不感興趣,請跳過這一部分,看“小結”。

如果你對知識喜歡刨根問底,那咱們來講講原理。

雖然不過寫了10幾行代碼,但是你構建的模型卻足夠複雜和高大上。它就是傳說中的卷積神經網絡(Convolutional Neural Network, CNN)。

它是深度機器學習模型的一種。最為簡單的卷積神經網絡大概長這個樣子:

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

最左邊的,是輸入層。也就是咱們輸入的圖片。本例中,是哆啦a夢和瓦力。

在計算機裡,圖片是按照不同顏色(RGB,即Red, Green, Blue)分層存儲的。就像下面這個例子。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

同理,在第一個Max pooling層上懸停,電腦也可以可視化展示給我們,該像素是從哪幾個像素區塊裡抽樣獲得的。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

這個網站,值得你花時間多玩兒一會兒。它可以幫助你理解卷積神經網絡的內涵。

回顧我們的示例圖:

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

下一層叫做全連接層(Fully Connected Layer),它其實就是把上一層輸出的若干個矩陣全部壓縮到一維,變成一個長長的輸出結果。

之後是輸出層,對應的結果就是我們需要讓機器掌握的分類。

如果只看最後兩層,你會很容易把它跟之前學過的深度神經網絡(Deep Neural Network, DNN)聯繫起來。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

既然我們已經有了深度神經網絡,為什麼還要如此費力去使用卷積層和採樣層,導致模型如此複雜呢?

這裡出於兩個考慮:

首先是計算量。圖片數據的輸入量一般比較大,如果我們直接用若干深度神經層將其連接到輸出層,則每一層的輸入輸出數量都很龐大,總計算量是難以想像的。

其次是模式特徵的抓取。即便是使用非常龐大的計算量,深度神經網絡對於圖片模式的識別效果也未必盡如人意。因為它學習了太多噪聲。而卷積層和採樣層的引入,可以有效過濾掉噪聲,突出圖片中的模式對訓練結果的影響。

你可能會想,咱們只編寫了10幾行代碼而已,使用的卷積神經網絡一定跟上圖差不多,只有4、5層的樣子吧?

不是這樣的,你用的層數,有足足50層呢!

它的學名,叫做Resnet-50,是微軟的研發成果,曾經在2015年,贏得過ILSRVC比賽。在ImageNet數據集上,它的分類辨識效果,已經超越人類。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

請看上圖中最下面的那一個,就是它的大略樣子。

足夠深度,足夠複雜吧。

如果你之前對深度神經網絡有一些瞭解,一定會更加覺得不可思議。這麼多層,這麼少的訓練數據量,怎麼能獲得如此好的測試結果呢?而如果要獲得好的訓練效果,大量圖片的訓練過程,豈不是應該花很長時間嗎?

沒錯,如果你自己從頭搭建一個Resnet-50,並且在ImageNet數據集上做訓練,那麼即便你有很好的硬件設備(GPU),也需要很長時間。

如果你在自己的筆記本上訓練……算了吧。

那麼,TuriCreate難道真的是個奇蹟?既不需要花費長時間訓練,又只需要小樣本,就能獲得高水平的分類效果?

不,數據科學裡沒有什麼奇蹟。

到底是什麼原因導致這種看似神奇的效果呢?這個問題留作思考題,請善用搜索引擎和問答網站,來幫助自己尋找答案。

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會

是不是超級簡單的項目呢!

神級程序員用Python和深度神經網絡識別圖像?任何零基礎都能學會


分享到:


相關文章: