TensorFlow 2.0 教程 01:基本圖形分類

TensorFlow 2 現在已經上線了!

TensorFlow 2現在是實時的!本教程將指導您使用深度學習構建一個簡單的CIFAR-10圖像分類器。在本教程中,我們將:

  • 定義一個模型
  • 設置一個數據管道
  • 訓練模型
  • 使用多GPU加速訓練速度
  • 為監控過程/更新學習計劃添加回調。

本教程中的代碼可以在這裡找到。(地址:https://github.com/lambdal/TensorFlow2-tutorial/tree/master/01-basic-image-classification )

定義模型

TensorFlow 2使用Keras作為其高級API。Keras提供了兩種定義模型的方法:順序式API和函數式API。

使用Keras的順序式API定義一個模型

TensorFlow 2.0 教程 01:基本圖形分類

使用Keras的函數式API定義相同的模型

TensorFlow 2.0 教程 01:基本圖形分類

順序式API與函數式API

這些API之間的主要區別是:順序式API要求其第一層使用input_shape提供,而函數式API要求其第一層是tf.keras.layers.Input,並且需要在最後調用tf.keras.models.Model構造器。

順序式API更簡潔,而函數式API更靈活,因為它允許一個模型是非順序式的。例如,要在ResNet中具有跳過連接。本教程採用TensorFlow官方的ResNet的Keras實現,它使用了函數式API。

TensorFlow 2.0 教程 01:基本圖形分類

設置一個數據管道

我們現在已經定義了一個模型。為了訓練這個模型,我們需要一個數據管道來向它提供標籤化的訓練數據。該數據管道執行以下任務:

  • 加載: 將數據集(例如圖像和標籤)從存儲器複製到程序的內存中。
  • 預處理:轉換數據集。例如,在圖像分類中,我們可能會調整大小、白化、洗牌或批處理圖像。
  • 供給數據: 從一個數據集中獲取例子並傳入到一個訓練循環中。

從存儲器加載數據

首先,我們將CIFAR-10從存儲器加載到numpy ndarrays:

TensorFlow 2.0 教程 01:基本圖形分類

注意:

  • 當您第一次調用keras.datasets.cifar10.load_data時,CIFAR-10將會被從網絡下載到 ~/.keras/datasets/cifar-10-batches-py.tar.gz。後續的調用就不涉及到網絡了。
  • x 表示尺寸為32 x 32 x 3的50000個圖像 (寬度、高度和三個RGB通道)。
  • y表示這50000個圖像的標籤。
TensorFlow 2.0 教程 01:基本圖形分類

理論上來說,我們可以簡單地將這些原始numpy.ndarray對象提供到一個訓練循環中,並將這稱為一個數據管道。然而,為了獲得更高的模型精度,我們需要對數據進行預處理(即在使用之前對其執行某些轉換)。為此,我們利用了Tensorflow的Dataset類。

tf.data.Dataset 類

TensorFlow的Dataset類有兩個主要用途:

  • 它充當一個保存訓練數據的容器。
  • 它可以被用來在訓練數據的元素上執行某些變換。

我們按照以下方式來實例化一個表示CIFAR-10數據集的tensorflow.data.Dataset對象:

TensorFlow 2.0 教程 01:基本圖形分類

在訓練過程中,存儲在train_dataset中的CIFAR-10訓練示例將通過take()迭代器進行訪問:

TensorFlow 2.0 教程 01:基本圖形分類

實際上,我們沒有執行任何數據預處理過程。調用take()只簡單地發送出原始CIFAR-10圖像;前20張圖像如下:

TensorFlow 2.0 教程 01:基本圖形分類

數據擴充

擴充經常用於“膨脹”訓練數據集,這可以提高泛化性能。

讓我們通過對每個圖像執行以下步驟來擴充CIFAR-10數據集:

  1. 使用一個四像素的黑色邊框填充圖像。
  2. 從填充圖像中隨機裁剪一個32x32的區域。
  3. 拋硬幣來決定圖像是否應該被水平翻轉。

我們首先定義一個函數,給定一個圖像,執行上面的步驟1-3:

TensorFlow 2.0 教程 01:基本圖形分類

接下來,我們調用方法map;這個調用會返回一個新的Dataset對象,該對象包含將CIFAR-10中的每個圖像傳遞到 augmentation中的結果。這個新對象將以原始順序來發送轉換後的圖像:

TensorFlow 2.0 教程 01:基本圖形分類

以下是擴充後的前20張圖像:

TensorFlow 2.0 教程 01:基本圖形分類

注: 擴充只應用於訓練集;在推理過程中應用擴充將導致不確定的預測和驗證分數。

隨機打亂

我們隨機打亂數據集。TensorFlow Dataset有一個shuffle方法,可以按照以下方式來將它鏈接到我們的擴充過程中:

TensorFlow 2.0 教程 01:基本圖形分類

要獲得完美的隨機打亂效果,buffer_size應該大於或等於數據集的大小(在本例中為50,000);對於大型數據集,這是不可能的。

以下是隨機打亂後的Dataset中的20張圖像:

TensorFlow 2.0 教程 01:基本圖形分類

規範化

將數據規範化是一種常見的做法。在這裡,我們定義一個函數,線性縮放每個圖像使具有零均值和單位方差:

TensorFlow 2.0 教程 01:基本圖形分類

接下來,我們將它與我們的擴充和隨機打亂操作鏈接起來:

TensorFlow 2.0 教程 01:基本圖形分類

數據batching

最後,我們對數據集進行batch操作。我們將drop_remainder設置為True以刪除足夠多的訓練示例,以便訓練集的大小可以被batch_size整除。

TensorFlow 2.0 教程 01:基本圖形分類

我們現在有了一個完整的數據管道。現在我們就可以開始訓練過程了。

訓練模型

Keras模型需要在訓練之前進行編譯。編譯過程本質上定義了三個東西:損失函數、優化器和評估指標:

TensorFlow 2.0 教程 01:基本圖形分類

注意,這裡我們使用了sparse_categorical_crossentropy和 sparse_categorical_accuracy,因為每個標籤都由一個整數(類的索引)表示。如果一個獨熱編碼向量表示每個標籤,那麼我們應該使用categorical_crossentropy 和 categorical_accuracy。

Keras使用fit API來訓練模型。我們可以選擇在每個validation_freq訓練epoch(迭代)中在一個驗證數據集上來測試模型。

注意,我們使用測試數據集只是為了進行驗證,因為CIFAR-10本身並不提供驗證集。模型合理性驗證應該在從訓練數據集中分割出來的一組數據上進行。

TensorFlow 2.0 教程 01:基本圖形分類

注意,在本例中,fit函數接受了TensorFlow數據集對象(train_dataset和 test_dataset)。如前所述,它還可以接受numpy的ndarrays作為輸入。使用數組的缺點是缺乏在數據集應用轉換的靈活性。

TensorFlow 2.0 教程 01:基本圖形分類

要對模型進行評估,我們可以使用測試數據集調用evaluate方法:

TensorFlow 2.0 教程 01:基本圖形分類

多GPU

到目前為止,我們已經展示瞭如何使用TensorFlow的Dataset API來創建一個數據管道,以及如何使用Keras API來定義模型並進行訓練和評估。下一步是讓代碼使用多個GPU來運行。

實際上,Tensorflow 2已經使您可以很容易地將您的單GPU實現轉換成使用多個GPU運行。您所需要做的就是定義一個分佈策略,並在策略範圍內創建模型:

TensorFlow 2.0 教程 01:基本圖形分類

我們這裡使用的是MirroredStrategy,它支持在一臺機器上的多個GPU上執行同步的分佈式訓練。默認情況下,它使用NVIDIA NCCL作為多gpu歸約實現。

注意,您將會想要基於您正在使用的GPU數量來使用數據管道的batch方法來擴展批尺寸。

TensorFlow 2.0 教程 01:基本圖形分類

添加回調

通常我們需要在訓練期間執行一些自定義操作。例如,您可能希望在訓練期間記錄統計信息以用於調試或優化;執行一個學習速率時間表來提高訓練效率;或者保存篩選器組聚集時的可視快照。在TensorFlow 2中,您可以使用回調特性來在訓練期間實現自定義事件。

Tensorboard

TensorBoard主要用於在訓練過程中記錄和可視化信息。它非常適合於檢查模型的性能。Tensorboard支持是通過tensorflow.keras.callbacks.TensorBoard回調函數提供的:

TensorFlow 2.0 教程 01:基本圖形分類

在上面的例子中,我們首先創建了一個TensorBoard回調,用於記錄每個訓練步驟的數據(通過update_freq=batch),然後將這個回調附加到fit函數。TensorFlow將會生成tfevents文件,可以使用TensorBoard將其可視化。例如,這是訓練過程中分類精度的可視化(藍色表示訓練精度,紅色表示驗證精度):

TensorFlow 2.0 教程 01:基本圖形分類

學習速率時間表

通常,我們希望隨著訓練的進行能對學習速率有良好的控制。一個自定義學習速率時間表可以作為回調函數來實現。在這裡,我們創建了一個自定義的schedule函數,它使用一個step函數(在第30個epoch和第45個epoch)來降低學習速率。這個schedule被轉換成一個keras.callbacks.LearningRateScheduler並附加到fit函數。

TensorFlow 2.0 教程 01:基本圖形分類

這些是一個60個epoch的自定義學習速率的統計信息:

TensorFlow 2.0 教程 01:基本圖形分類

總結

本教程以圖像分類為例,介紹了TensorFlow 2.0的基礎知識。我們覆蓋了:

  • 帶有TensorFlow 2的數據集API的數據管道
  • 使用Keras (TensorFlow 2的官方高級API)訓練、評估、保存和恢復模型
  • 帶有分佈式策略的多GPU
  • 帶有回調的自定義訓練

下面是本教程的完整代碼。您還可以使用此TensorFlow 2.0教程代碼倉庫來複制我們有關TensorFlow 2.0的教程。

TensorFlow 2.0 教程 01:基本圖形分類

TensorFlow 2.0 教程 01:基本圖形分類

英文原文:https://lambdalabs.com/blog/tensorflow-2-0-tutorial-01-image-classification-basics/


分享到:


相關文章: