當前位置:
首頁 > 新聞 > Colab 超火的 Keras/TPU 深度學習免費實戰,有點 Python 基礎就能看懂的快速課程

Colab 超火的 Keras/TPU 深度學習免費實戰,有點 Python 基礎就能看懂的快速課程

新智元推薦

來源:大數據文摘(ID:BigDataDigest)

編譯:曹培信、周素雲、蔣寶尚

【新智元導讀】僅會一點點python也能自己搭建一個神經網路!谷歌開發者博客的 Codelabs 項目上面給出了一份教程,不只是教你搭建神經網路,還給出四個實驗案例,手把手教你如何使用 keras、TPU、Colab。

想要真的了解深度學習,除了看視頻,拿數據和算力真槍實彈的練手可能比各種理論知識更重要。

編程基礎不好?不會配置環境?本地 GPU 太貴配置太低?訓練速度達不到要求?這些可能都是阻礙你搭建第一個神經網路的原因。

谷歌開發者博客的 Codelabs 項目上面給出了一份教程(課程鏈接在文末),不只是教你搭建神經網路,還給出四個實驗案例,手把手教你如何使用 keras、TPU、Colab。

這個練手指南被成為 「僅會一點點 python 也能看懂」,也就是說,基礎再薄弱都可以直接了解哦。

四次實驗均在谷歌的 Collab 上運行,由淺入深、循序漸進。無需進行任何設置,可以用 Chromebook 打開,實驗環境都幫你搭建好了。

是時候搭建一個屬於自己的神經網路了!

快速開啟!

四次實驗均選擇 TPU 支持,這會使代碼運行速度大大加快,畢竟用了硬體加速。

先教會你如何在 Tensorflow 框架下快速載入數據,然後介紹一些 tf.data.Dataset 的基礎知識,包括 eager 模式以及元組數據集等。

第二部分,手把手教你實現遷移學習,把別人訓練好的模型拿過來直接使用,不用一步一步搭建也能使用強大的神經網路。除了遷移學習,在這部分還會簡單介紹一些必要的知識點,包括神經元、激活函數等。

第三部分,進入卷積神經網路部分,在了解卷積層、池化層、Dense 層卷積網路三個必要的組件之後,你將學會使用 Keras Sequential 模型構建卷積圖像分類器,並使用良好的卷積層選擇來微調模型。

第四部分,進入到更加前沿的部分,在接受了前面三個部分的洗禮之後,在這部分你會實現在 Keras 中利用 TPU 組建現代卷積網路和實現分類。

和在 Jupyter Notebook 操作方式一樣,同時按住鍵盤的 Shift 和 enter 按鈕,便可以運行代碼。

如果你是首次執行,需要登錄 Google 帳戶進行身份驗證。注意頁面提醒就可以啦~

此 notebook 支持目錄功能,點擊網頁左側的黑色箭頭可以查看。

利用 Colab 上的 TPU 訓練 Keras 模型需要輸入以下代碼

本質上是在 keras 中調用 keras_to_tpu_model,部署額外的硬體可以通過增加訓練批次的大小增加訓練過程。需要注意的是目前,Keras 支持僅限於 8 個核心或一個 Cloud TPU。

註:TPU 可以在神經網路運算上達到高計算吞吐量,同時能耗和物理空間都很小。因為 TPU 從內存載入數據。當每個乘法被執行後,其結果將被傳遞到下一個乘法器,同時執行加法。因此結果將是所有數據和參數乘積的和。在大量計算和數據傳遞的整個過程中,不需要執行任何的內存訪問。

介紹完基本的操作,接下來,看看官方給出的四個實驗。

Tensorflow 入門:tfrecords 和 tf.data

此實驗涉及兩個 tf 的基礎操作,一個是使用 tf.data.Dataset API 導入訓練數據,另一個是使用 TFRecord 格式從 GCS 有效導入訓練數據。

此次實驗使用花卉圖片的數據集,學習的目標是將其分為 5 種類別。使用 tf.data.Dataset API 執行數據載入。

Keras 和 Tensorflow 在其所有訓練和評估功能中接受數據集。在數據集中載入數據後,API 會提供對神經網路訓練數據有用的所有常用功能:

了解 API 並試著運行:

https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/02_Dataset_playground.ipynb

關於鮮花數據集,數據集按 5 個文件夾組織,每個文件夾都包含一種花。文件夾名為向日葵,雛菊,蒲公英,鬱金香和玫瑰。數據託管在 Google 雲端存儲上的公共存儲區中。

tf.data.Dataset 基礎知識

數據通常包含多個文件,此處為圖像,通過調用以下方法創建文件名數據集:

然後,將函數 「映射」 到每個文件名,這些文件通常導入文件並解碼為內存中的實際數據:

https://codelabs.developers.google.com/codelabs/keras-flowers-data/#3

但逐個載入圖像很慢,在迭代此數據集時,每秒只可以載入 1-2 個圖像。我們將用訓練的硬體加速器,可以將速率提高很多倍。

快速載入數據

我們將在本實驗中使用的 Tensor Processing Unit(TPU)硬體加速器。Google 雲端存儲(GCS)能夠保持極高的吞吐量,但與所有雲存儲系統一樣,形成連接時需要來回請求。因此,將數據存儲為數千個單獨的文件並不理想。我們將在少量文件中批量處理它們,並使用 tf.data.Dataset 的強大功能一次性讀取多個文件。

通過載入圖像文件的代碼將它們調整為通用大小,然後將它們存儲在 16 個 TFRecord 文件中,代碼鏈接如下:

https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/03_Flower_pictures_to_TFRecords.ipynb

經驗法則是將數據分成幾個(10s 到 100s)的大文件(10s 到 100s 的 MB)。如果有太多文件,例如數千個文件,那麼訪問每個文件的時間可能會開始妨礙。如果文件太少,例如一兩個文件,那麼就無法並行獲取多個文件的優勢。

TFRecord 文件格式

Tensorflow 用於存儲數據的首選文件格式是基於 protobuf 的 TFRecord 格式。其他序列化格式也可以使用,可以通過以下方式直接從 TFRecord 文件載入數據集:

但你擁有 TFRecords 的數據集時,下一步解碼步驟就是從每個記錄中獲得數據。如前所述,你將使用 Dataset.map,並注意 num_parallel_reads=32 參數。這將從 32 個 TFRecord 文件並行載入數據,可以獲得最佳性能。

在 Keras 中利用遷移學習

本次實驗在 keras 中實現遷移學習,將強大的預訓練模型應用於我們的數據集,不用費力重新訓練模型。此外,本實驗包含有關神經網路的必要理論解釋。

神經網路分類器是由幾個層的神經元組成。對於圖像分類,這些可以是 Dense 層,或者更常見的是卷積層。它們通常通過 relu 激活函數激活。最後一層使用與類相同數量的神經元,並使用 softmax 激活。對於分類,交叉熵是最常用的損失函數,將獨熱編碼標籤(即正確答案)與神經網路預測的概率進行比較。例如,為了最大限度地減少損失,最好選擇具有動量的優化器 AdamOptimizer 並批量訓練圖像和標籤。

對於構建為層序列的模型,Keras 提供了 Sequential API。例如,使用三個 Dense 層的圖像分類器可以在 Keras 中編寫為:

Dense 神經網路

這是用於分類圖像的最簡單的神經網路。它由分層排列的 「神經元」 組成。第一層處理輸入數據並將其輸出饋送到其他層。之所以被稱為 「Dense」 是因為每個神經元都連接到前一層中的所有神經元。

你可以將圖像的所有像素的 RGB 值展開為長矢量並將其用作輸入,從而將圖像輸入到此類網路中。它不是圖像識別的最佳技術,但我們稍後會對其進行改進。

神經元

「神經元」 計算其所有輸入的並進行加權求和,添加一個稱為 「偏差」 的值,並通過所謂的 「激活函數」 提供結果。權重和偏差最初是未知的。它們將被隨機初始化並通過在許多已知數據上訓練神經網路來 「學習」。

最流行的激活函數被稱為 RELU(Rectified Linear Unit)如上圖所示。

Softmax 激活

我們將花分為 5 類(玫瑰,鬱金香,蒲公英,雛菊,向日葵),使用經典 RELU 激活函數。然而,在最後一層,我們想要計算 0 到 1 之間的數字,表示這朵花是玫瑰,鬱金香等的概率。為此,我們將使用名為 「softmax」 的激活函數。

在矢量上應用 softmax 函數是通過取每個元素的指數然後歸一化矢量來完成的,通常使用 L1 範數(絕對值之和),使得這些值加起來可以解釋為概率。

對於圖像分類問題,Dense 層可能是不夠的。但我們也可以另闢蹊徑!有完整的卷積神經網路可供下載。我們可以切掉它們的最後一層 softmax 分類,並用下載的替換它。所有訓練過的權重和偏差保持不變,你只需重新訓練你添加的 softmax 層。這種技術被稱為遷移學習,只要預先訓練神經網路的數據集與你的 「足夠接近」,它就可以工作。

請打開下面的 notebook,同時按住 Shift-ENTER 運行代碼:

https://codelabs.developers.google.com/codelabs/keras-flowers-convnets/#0

插圖:使用已經訓練過的複雜卷積神經網路作為黑匣子,僅對分類的最後一層進行再訓練。這是遷移學習。

通過遷移學習,你可以從頂級研究人員已經開發的高級卷積神經網路架構和大量圖像數據集的預訓練中受益。在我們的案例中,我們將從 ImageNet 訓練的網路遷移學習。

在 Keras 中,可以從 tf.keras.applications.* 集合中實例化預先訓練的模型。例如,MobileNet V2 是一個非常好的卷積架構,其尺寸合理。通過選擇 include_top=False,你可以獲得沒有最終 softmax 圖層的預訓練模型,以便你可以添加自己的模型:

另請注意 pretrained_model.trainable = False 設置。它凍結了預訓練模型的權重和偏差,因此你只能訓練 softmax 圖層。這通常針對相對較少的權重並且可以快速完成而無需非常大的數據集。但是,如果你確實擁有大量數據,那麼 pretrained_model.trainable = True 可以讓遷移學習更好地工作。然後,經過預先訓練的權重可提供出色的初始值,並且仍可通過訓練進行調整,以更好地適應你的問題。

最後,請注意在 dense softmax 層前插入 Flatten()層。Dense 層對數據的平面向量起作用,但我們不知道這是否是預訓練模型返回的內容,這就是我們需要扁平化的原因。在下一章中,當我們深入研究卷積體系結構時,我們將解釋卷積層返回的數據格式。

在 Keras 中利用 TPU 組建卷積神經網路

本次實驗,完成三個目標:

使用 Keras Sequential 模型構建卷積圖像分類器。

在 TPU 上訓練 Keras 模型

使用良好的卷積層選擇來微調模型。

卷積將神經網路將一系列濾波器應用於圖像的原始像素數據以提取和學習更高級別的特徵,使得該模型能夠將這些特徵用於分類。卷積將神經網路包含三個組件:

卷積層,將特定數量的卷積濾鏡(convolution filters)應用於圖像。對於每個子區域,圖層執行一組數學運算以在輸出特徵映射中生成單個值。

池化層(Pooling layers),負責對由卷積層提取的圖像數據進行下採樣以減少特徵映射的維度以提高處理效率。常用的池化演算法是最大池化,其提取特徵地圖的子區域(例如,2×2 像素的塊),保持它們的最大值並丟棄所有其他值。

Dense 層,對由卷積圖層提取的特徵並由共用圖層進行下採樣執行分類。Dense 層是全連接的神經網路,在 Dense 層中,圖層中的每個節點都連接到前一圖層中的每個節點。

用最大池化做卷積的動畫示例如下

用 Softmax 激活函數連接分類器,典型的卷積分類器如下

在 keras 中搭建神經網路代碼如下:

在搭建的過程中,必須在權重和偏差之間找到適當的平衡點,如果權重太大,神經網路可能無法代表複雜性,如果參數太多,可能導致過擬合。所以在在 Keras 中,用 model.summary () 函數顯示模型的結構和參數:

具體代碼地址:

https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/07_Keras_Flowers_TPU_playground.ipynb

在 Keras 中利用 TPU 組建現代卷積網路和實現分類

之前三個實驗已經分別介紹了 TPU、遷移學習和卷積網路,是不是已經覺得很厲害了?別著急,最後的大招來了,本次實驗我們將實現在 Keras 中利用 TPU 組建現代卷積網路和實現分類。

現代卷積架構(Modern convolutions networks)

簡而言之,從 "Inception" 和 "Inception v2" 開始的現代卷積網路通常使用 「模塊」,其中在同一輸入上同時嘗試不同的卷積層,它們的輸出被連接並且網路通過訓練決定哪個層是最有用的。

在 Keras 中,要創建數據流可以分支進出的模型,必須使用 「functional」 模型。這是一個例子:

其他小技巧

小型 3x3 濾波器

在此圖中,你可以看到兩個連續 3x3 濾波器的結果。嘗試追溯哪些數據點對結果有貢獻:這兩個連續的 3x3 濾波器計算 5x5 區域的某種組合。它與 5x5 濾波器計算的組合併不完全相同,但值得嘗試,因為兩個連續的 3x3 濾波器比單個 5x5 濾波器效率更高。

1x1 卷積?

在數學術語中,「1x1」 卷積是常數的乘法,而不是非常有用的概念。但是,在卷積神經網路中,請記住濾波器應用於數據立方體,而不僅僅是 2D 圖像。因此,「1x1」 濾波器計算 1x1 數據列的加權和(參見圖示),當你在數據中滑動時,你將獲得輸入通道的線性組合。這實際上很有用。如果你將通道視為單個過濾操作的結果,例如 「貓耳朵」 的過濾器,另一個用於 「貓鬍鬚」,第三個用於 「貓眼睛」,則 「1x1」 卷積層將計算多個這些特徵的可能線性組合,在尋找 「貓」 時可能很有用。

Squeezenet

將這些想法融合在一起的簡單方法已在 「Squeezenet」 論文中展示,即一種僅使用 1x1 和 3x3 卷積層的卷積模塊設計。

https://arxiv.org/abs/1602.07360

基於 「fire model」 的 squeezenet 架構。它們交替使用 1x1 層,在垂直維度上 「擠壓」 輸入數據,然後是兩個並行的 1x1 和 3x3 卷積層,再次 「擴展」 數據深度。

構建一個受 squeezenet 啟發的卷積神經網路時,我們就不能直接像上面一樣直接堆疊已有模塊,需要將模型代碼更改為 Keras 的 「功能樣式」,來定義自己的模塊。

想要嘗試 Squeezenet 架構練習的戳以下鏈接:

https://codelabs.developers.google.com/codelabs/keras-flowers-squeezenet/#6

最後,手把手教程運行代碼如下:

https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/07_Keras_Flowers_TPU_playground.ipynb

最後,再次給出四個實驗的鏈接,供參考喲~

https://codelabs.developers.google.com/codelabs/keras-flowers-data/#2

https://codelabs.developers.google.com/codelabs/keras-flowers-transfer-learning/#2

https://codelabs.developers.google.com/codelabs/keras-flowers-convnets/#0

https://codelabs.developers.google.com/codelabs/keras-flowers-squeezenet/#0

此項目支持答疑,打開下列網址提交你的問題

https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/07_Keras_Flowers_TPU_squeezenet.ipynb

本文經授權轉載自大數據文摘(ID:BigDataDigest)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

一張貼紙就能騙過AI攝像頭:活人直接隱身,監控攝像也不安全了!
日本獨立科技分析機構:華為Mate 20 Pro晶元媲美iPhone XS

TAG:新智元 |