1. 程式人生 > >[深度學習]七行程式碼體驗深度學習的神奇

[深度學習]七行程式碼體驗深度學習的神奇

簡介

這是深度學習系列的第一節,這個課程是為了讓深度學習更能為大眾接受,為了那些在機器學習和數學方面沒有很深厚背景的同學設計。我們強烈相信深度學習將在很多領域產生變革;比如,這個課程的物件是有計算機程式設計背景的同學以及想在他們專業領域引用這些技術的人。

這節課的最後,我們將理解如何僅用七行程式碼寫出有使用意義的深度學習技術。

為什麼現在要學習深度學習技術?

由於下面3個關鍵原因,深度學習現在變得越來越重要:

  • 無限可變的方程:驅動深度學習進展的方程是神經網路,它實際上是通用逼近機。具體而言,通用逼近理論告訴我們,這個函式能夠處理我們應用的任何問題。
  • 引數擬合:通過梯度下降和反向傳播,我們能夠擬合任何給定訓練集的引數。使得我們可以近似理論方程,這個方程允許我們做任何事情,並應用它。
  • 速度和可拓展性:深度學習依賴於矩陣操作來實現計算成本昂貴的結果。圖形處理單元(GPU)是經過優化的處理器,可以執行計算機圖形和影象處理等計算。幸運的是,遊戲產業的發展導致了廉價和強大的GPU。

由於這些原因,現在任何人都可以以既經濟又快速的方式將深度學習技術應用於實際問題。

深度學習的成長

Jeff Dean最近的一次演講突顯了Google在深度學習方面的大幅增長。正如我們所看到的,Google的深度學習專案在過去的幾年裡呈現爆炸式的增長,幾乎所有應用中都有應用。我們相信,任何組織都可能實現相似的增長,不僅僅是科技巨頭。

我們已經可以看到業餘愛好者如何輕鬆地將深度學習應用於各種有影響力的應用:

  • 面板損傷的分類:使用一個預訓練的CNN網路,和我們這節課用到的非常相似,這個小組建立了一個模型,可以以60%的準確率分類面板損傷,和之前15.6%的基準相比,提升了4倍。這是一個巨大的進步。
  • 植物疾病的分類:這組工業工程師能夠成功將健康的葉子與有13種其他疾病的葉子區分開。
  • 無線電調製分類:一組電子和計算機工程師使用深度學習來識別無線電調製。他們的結果表明,有可能使感測系統的有效覆蓋面積增加一倍,我們看到深度學習產生的巨大影響。
  • 心臟症狀診斷:兩位對衝基金分析師能夠建立一個能像醫生一樣準確診斷心臟狀況的模型。這是非常驚人的。
  • 衣服分類:這個小組成功建立一個模型,可以識別衣服的物品,以及它們的種類。

這只是冰山一角。像病變分類和心臟診斷這樣的應用程式在整個發展中國家有很大的潛力來徹底改變醫療保健。再次強調,任何具有計算機程式設計背景的人都可以學習如何完成類似的事情,而不必成為該領域的專家。我們的目標是教你如何做到這一點,希望我們能夠將深度學習的影響擴大到所有領域。

準備工作

GPU訪問

為了這個課程的進行,你需要一個能夠適用於深度學習的GPU。幸運的是,亞馬遜網路服務(AWS)現在有NVIDIA GPU的例項可以使用。或者對於基礎網路,也可以使用個人電腦的CPU進行運算,當然運算速度相比會很慢。

必要檔案

參閱github wiki page,瞭解如何從我們的github倉庫獲取必要的檔案。主要是utils.py等配置檔案需要提前下載好。

然後,需要下載將用來訓練和測試我們的模型的資料集。在本課中,先來看看Dogs vs. Cats,Kaggle的比賽,要求使用者分類貓和狗的影象。當時的工藝水平,準確率可以達到80%。我們將很快看到如何建立一個精度達到97%的簡單模型。

在下載資料之前,在名為data的 nbs中建立一個子目錄。 然後將dogscats.zip下載到該目錄並解壓縮。

資料結構

需要注意的是這些資料的結構,因為我們使用的深度學習模型的實現將依賴它。

構建機器學習模型的標準做法是將我們的資料分成以下子集:

  • 訓練集:這是我們的演算法將用來擬合引數以進行預測的資料
  • 驗證集:我們用來微調(fine tuning)引數的資料
  • 測試集:我們用來測試我們的最終模型的資料。 由於這個資料以前沒有被模型看到過,所以它的目的是模擬它將如何執行新的資料。

對DogsCats目錄的快速瀏覽可以看到:測試,訓練和驗證集在不同的子目錄中。在這些目錄下面還有子目錄,cats and dogs,分別包含每個類別的資料。注意,每個狗和貓影象被標記為了狗或貓。也可以看到,我們的測試資料是沒有標籤的,正如我們所期望的那樣。

注意這些結構是很重要的,因為將要使用的深度學習實現,希望資料目錄遵循這些約定。具體來說,它將根據訓練和驗證目錄下的子目錄的數量,知道要訓練多少個類別。嘗試將此模型應用於其他資料集時,請務必遵循這些約定。

注意到另一個名為sample的目錄。訓練和驗證整個資料集可能需要一些時間。因此,在調整實現時,可以在訓練和驗證資料的小樣本上執行演算法,這是很好的技巧。這樣做,可以立即得到結果,直到滿意為止,並準備在整個資料集上構建模型。

使用卷積神經網路

在第一課中,我們將瞭解 允許計算機“看”的卷積神經網路(CNN)。

介紹本週的任務:’Dogs vs. Cats’

我們將嘗試建立一個模型來進入Kaggle的Dogs vs Cats比賽。現在有25,000張貼有標籤狗和貓的照片可供訓練,還有12500張照片需要在本次比賽中進行標註。根據Kaggle的網站,當這個比賽在2013年底開始時:“現有技術水平:目前的文獻表明機器分類器在這個任務上的準確率可以達到80%以上”。 所以如果我們能夠擊敗80%,那麼我們將在2013年處於領先地位!

基本設定

這裡用到notebook來執行程式碼,對於Notebook的使用可以檢視教程:
Jupyter Notebook教程 in Python

在開始執行model之前,需要先進行配置和匯入必要的包,第一步是執行

%matplotlib inline

這是為了確保plot可以顯示在notebook中。

再次推薦使用notebook,因為它可以儲存下你操作的所有中間過程,方便後續檢視。注意在第一次使用anaconda,匯入深度學習工具utils.py的時候,會不斷提示缺少各種庫,缺哪個,用anaconda下載安裝即可,非常方便。

下面定義path,在sample資料和完整資料上可以切換

#path = "data/dogscats/"
path = "data/dogscats/sample/"

接著匯入下面幾個庫:

from __future__ import division,print_function
import os, json
from glob import glob
import numpy as np
np.set_printoptions(precision=4, linewidth=100)
from matplotlib import pyplot as plt
import utils; reload(utils)
from utils import plots

之前已經下載了utils.py,裡面封裝了一些我們常用的函式。

如果在庫裡面做了任何改動,reload(utils)將會更新notebook。

下面就可以開始檢視model了

使用一個預訓練的VGG 模型和我們的Vgg16類

第一步是一個預先被建立好的,使用非常便利的model,可以識別各種影象(1000中類別)。我們將使用’VGG’,贏得2014年的影象比賽,這個模型建立和理解都非常簡單。

VGG ImageNet團隊建立了一個更大的,更慢,更精確的模型(VGG19)和一個更小,更快的模型(VGG16)。我們將使用VGG16,由於VGG19的效能較慢,只是為了較小精度的提升並不值得。這裡建立了一個python類,Vgg16,可以直接使用VGG16模型。

要理解Vgg16是建立在資料上的,這很重要,檢視下面的影象,可以看到大多數的影象都是單個物體,這意味著Vgg16對於影象是一個物件的情況最合適,比如我們的貓和狗的影象。當使用預訓練模型,探討它被訓練時的資料是有必要的,你可以理解它的侷限和偏差。

http://wx3.sinaimg.cn/mw690/a9c4d5f6gy1fncsjk7jz8j20t20lahdt.jpg” alt=”” title=”” />

重點:7行程式碼中最先進的自定義模型。

理解了Vgg16是什麼,是基於什麼訓練的,下面就來看看用七行程式碼建立一個最先進的模型,在Cats vs. Dogs datset中精確度超過97%。

# 儘可能的打,但不建議超過64
# 如果你的GPU比較老或者便宜,跑起來會提示耗盡記憶體,然後就減小batch_size
batch_size=64
# 匯入類和例項
from vgg16 import Vgg16
vgg = Vgg16()

# 每次抓取一些影象來訓練和驗證
# 注:他們子目錄的命名必須基於他們的類別
batches = vgg.get_batches(path+'train', batch_size=batch_size)
val_batches = vgg.get_batches(path+'valid', batch_size=batch_size*2)

vgg.finetune(batches)
vgg.fit(batches, val_batches, nb_epoch=1)

現在,我們已經有了一個分類貓和狗的模型,只要給出正確的目錄,它很容易來產生任何影象的分類問題。

接下來一行一行分析程式碼:

使用Vgg16來進行基本的影象識別

建立一個Vgg16物件:

vgg = Vgg16()

Vgg16是在Keras上建立的,Keras是一個封裝的深度學習庫,基於Theano或者TensorFlow。使用很方便。Keras在batches中讀取影象和標籤,直接使用目錄結構,每個訓練分類的影象必須放在一個分開的目錄中。下面就是從訓練檔案中抓取資料的batches。

batches = vgg.get_batches(path+'train', batch_size=4)

batches只是一個普通的python迭代器。

為了更好的理解Vgg16幹了什麼,把btach的中的影象plot出來,

這裡有個獨熱編碼(one hot encoding),有N個元素(這裡只有2個元素),只有1個是1,其他都是0。比如如果分類是3個,貓,狗,袋鼠。結果就是 [0, 0, 1] 或 [1, 0, 0] 或 [0, 1, 0]。

下面的方法可以得到影象原始分類的概率,分類的索引,分類的名字:

vgg.predict(imgs, True)

使用Vgg16來 finetune 模型

原本是1000個指定的類別,為了將輸出變成我們要的貓和狗兩個型別,就是進行所謂的”finetune”。

先填充batches

batch_size=64
batches = vgg.get_batches(path+'train', batch_size=batch_size)
val_batches = vgg.get_batches(path+'valid', batch_size=batch_size)

呼叫finetune()來修改模型,分批提供資料來預測貓和狗。

vgg.finetune(batches)

最後,使用訓練資料fit()模型的引數,每個epoch之後會打印出在驗證集上精確度。一個epoch就是對訓練資料的一次完全訓練。

vgg.fit(batches, val_batches, nb_epoch=1)

可以看到精確度並不高,因為只是simple訓練集,符合預期。接下來切換到完整目錄,再來一次,最後會得到很高的97%精確度。