TensorFlow和Keras入門必讀教程

fans news 發佈 2021-10-14T17:46:44+00:00

導讀:本文對TensorFlow的框架和基本示例進行簡要介紹。

導讀:本文對TensorFlow的框架和基本示例進行簡要介紹。

作者:班傑明·普朗什(Benjamin Planche)艾略特·安德烈斯(Eliot Andres)

來源:華章科技

01 TensorFlow

TensorFlow最初由Google開發,旨在讓研究人員和開發人員進行機器學習研究。它最初被定義為描述機器學習算法的接口,以及執行該算法的實現。

TensorFlow的主要預期目標是簡化機器學習解決方案在各種平台上的部署,如計算機CPU、計算機GPU、行動裝置以及最近的瀏覽器中的部署。最重要的是,TensorFlow提供了許多有用的功能來創建機器學習模型並大規模運行它們。TensorFlow 2於2019年發布,它專注於易用性,並能保持良好的性能。

這個庫於2015年11月開源。從那時起,它已被世界各地的用戶改進和使用。它被認為是開展研究的首選平台之一。就GitHub活躍度而言,它也是最活躍的深度學習框架之一。

TensorFlow既可供初學者使用,也可供專家使用。TensorFlow API具有不同級別的複雜度,從而使初學者可以從簡單的API開始,同時也可以讓專家創建非常複雜的模型。我們來探索一下這些不同級別的模型。

1. TensorFlow主要架構

TensorFlow架構(見圖2-1)具有多個抽象層級。我們首先介紹底層,然後逐漸通往最上層。

大多數深度學習計算都是用C++編碼的。為了在GPU上進行運算,TensorFlow使用了由NVIDIA開發的庫CUDA。這就是如果想要利用GPU功能就需要安裝CUDA,以及不能使用其他硬體製造商GPU的原因。

然後,Python底層API(low-level API)封裝了C++原始碼。當調用TensorFlow的Python方法時,通常會在後台調用C++代碼。這個封裝層使用戶可以更快地工作,因為Python被認為更易於使用並且不需要編譯。該Python封裝器可以創建非常基本的運算,例如矩陣乘法和加法。

最上層是高級API(high-level API),由Keras和評估器API(estimator API)兩個組件組成。Keras是TensorFlow的一個用戶友好型、模塊化且可擴展的封裝器,評估器API包含多個預製組件,可讓你輕鬆地構建機器學習模型。你可以將它們視為構建塊或模板。

  • tip:在深度學習中,模型通常是指經過數據訓練的神經網絡。模型由架構、矩陣權重和參數組成。

2. Keras介紹

Keras於2015年首次發布,它被設計為一種接口,可用於使用神經網絡進行快速實驗。因此,它依賴TensorFlow或Theano(另一個深度學習框架,現已棄用)來運行深度學習操作。keras以其用戶友好性著稱,是初學者的首選庫。

自2017年以來,TensorFlow完全集成了Keras,這意味著無須安裝TensorFlow以外的任何庫就可使用它。我們將依賴tf.keras而不是Keras的獨立版本。這兩個版本之間有一些細微的差異,例如與TensorFlow的其他模塊的兼容性以及模型的保存方式。因此,讀者必須確保使用正確的版本,具體方法如下:

  • 在代碼中,導入tf.keras而不是keras。
  • 瀏覽TensorFlow網站上的tf.keras文檔,而不是keras.io文檔。
  • 在使用外部Keras庫時,請確保它們與tf.keras兼容。
  • 某些保存的模型在Keras版本之間可能不兼容。

這兩個版本在可預見的未來將繼續共存,而tf.keras與TensorFlow集成將越來越密切。為了說明Keras的強大功能和簡單性,我們將使用該庫實現一個簡單的神經網絡。

02 基於Keras的簡單計算機視覺模型

在深入探討TensorFlow的核心概念之前,我們先從一個計算機視覺的經典示例開始,它使用數據集MNIST進行數字識別。

1. 準備數據

首先,導入數據。它由用於訓練集的60 000幅圖像和用於測試集的10 000幅圖像組成:

import tensorflow as tf

num_classes = 10
img_rows, img_cols = 28, 28
num_channels = 1
input_shape = (img_rows, img_cols, num_channels)

(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
  • tip:常見的做法是使用別名tf來導入TensorFlow,從而加快讀取和鍵入速度。通常用x表示輸入數據,用y表示標籤。

tf.keras.datasets模塊提供快速訪問,以下載和實例化一些經典數據集。使用load_data導入數據後,請注意,我們將數組除以255.0,得到的數字範圍為[0, 1]而不是[0, 255]。將數據歸一化在[0, 1]範圍或[-1, 1]範圍是一種常見的做法。

2. 構建模型

現在,我們可以繼續構建實際模型。我們將使用一個非常簡單的架構,該架構由兩個全連接層(也稱為稠密層)組成。在詳細介紹架構之前,我們來看一下代碼。可以看到,Keras代碼非常簡潔:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='softmax'))

由於模型是層的線性堆棧,因此我們首先調用Sequential函數。然後,依次添加每一層。模型由兩個全連接層組成。我們逐層構建:

  • 展平層(Flatten):它將接受表示圖像像素的二維矩陣,並將其轉換為一維數組。我們需要在添加全連接層之前執行此操作。28×28的圖像被轉換為大小為784的向量。
  • 大小為128的稠密層(Dense):它使用大小為128×784的權重矩陣和大小為128的偏置矩陣,將784個像素值轉換為128個激活值。這意味著有100 480個參數。
  • 大小為10的稠密層(Dense):它將把128個激活值轉變為最終預測。注意,因為概率總和為1,所以我們將使用softmax激活函數。
  • tip:softmax函數獲取某層的輸出,並返回總和為1的概率。它是分類模型最後一層的選擇的激活函數。

請注意,使用model.summary()可以獲得有關模型、輸出及其權重的描述。下面是輸出:

設置好架構並初始化權重後,模型現在就可以針對所選任務進行訓練了。

3. 訓練模型

Keras讓訓練變得非常簡單:

model.compile(optimizer='sgd',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
callbacks = [tf.keras.callbacks.TensorBoard('./keras')]
model.fit(x_train, y_train, epochs=25, verbose=1, validation_data=(x_test, y_test), callbacks=callbacks)

在剛剛創建的模型上調用.compile()是一個必需的步驟。必須指定幾個參數:

  • 優化器(optimizer):運行梯度下降的組件。
  • 損失(loss):優化的指標。在本例中,選擇交叉熵,就像上一章一樣。
  • 評估指標(metrics):在訓練過程進行評估的附加評估函數,以進一步查看有關模型性能(與損失不同,它們不在優化過程中使用)。

名為sparse_categorical_crossentropy的Keras損失執行與categorical_crossentropy相同的交叉熵運算,但是前者直接將真值標籤作為輸入,而後者則要求真值標籤先變成獨熱(one-hot)編碼。因此,使用sparse_...損失可以免於手動轉換標籤的麻煩。

  • tip:將'sgd'傳遞給Keras等同於傳遞tf.keras.optimizers.SGD()。前一個選項更易於閱讀,而後一個選項則可以指定參數,如自定義學習率。傳遞給Keras方法的損失、評估指標和大多數參數也是如此。

然後,我們調用.fit()方法。它與另一個流行的機器學習庫scikit-learn中所使用的接口非常相似。我們將訓練5輪,這意味著將對整個訓練數據集進行5次疊代。

請注意,我們將verbose設置為1。這將讓我們獲得一個進度條,其中包含先前選擇的指標、損失和預計完成時間(Estimated Time of Arrival,ETA)。ETA是對輪次結束之前剩餘時間的估計。進度條如圖2-2所示。

4. 模型性能

如第1章中所述,你會注意到模型是過擬合的——即訓練準確率大於測試準確率。如果對模型訓練5輪,則最終在測試集上的準確率為97%。這比上一章(95%)高了約2個百分點。最先進的算法可達到99.79%的準確率。

我們遵循了三個主要步驟:

  1. 加載數據:在本例中,數據集已經可用。在未來的項目中,你可能需要其他的步驟來收集和清理數據。
  2. 創建模型:使用Keras可以讓這一步驟變得容易——按順序添加層即可定義模型的架構。然後,選擇損失、優化器和評估指標進行監控。
  3. 訓練模型:模型第一次運行效果很好。在更複雜的數據集上,通常需要在訓練過程中微調參數。

藉助TensorFlow的高級API——Keras,整個過程非常簡單。在這個簡單API的背後,該庫隱藏了很多複雜操作。

關於作者:班傑明·普朗什(Benjamin Planche),他在計算機視覺和深度學習領域的全球多個研究實驗室(法國LIRIS、日本三菱電機和德國西門子)工作超過5年。他的研究重點是針對工業應用使用更少的數據開發更智能的視覺系統。他還在在線平台(例如StackOverflow)上分享自己的知識和經驗,或者創建有美感的演示系統。

艾略特·安德烈斯(Eliot Andres),深度學習和計算機視覺工程師。他在該領域擁有3年以上的經驗,涉及銀行、醫療、社交媒體和視頻流等行業。他關注的是工業化,即通過將新技術應用於商業問題來實現價值。

本文摘編自《計算機視覺實戰:基於TensorFlow 2》,經出版方授權發布。

推薦語:本書從計算機視覺和深度學習基礎知識開始,教你如何從頭開始構建神經網絡。你將掌握一些讓TensorFlow成為廣泛使用的Al庫的特性,以及直觀的Keras接口,繼而高效地構建、訓練和部署CNN。

關鍵字: