TensorFlow 快速入門示例
因為本課程是以案例為驅動進行框架的應用與講解,因此我們這一節以一個簡單的示例來幫助大家了解 TensorFlow 框架的使用方法以及基本的程序框架與流程。
既然要進行模型的構建與訓練,那么數據集便是必不可少的一部分。因為所有的模型都是建立在一定的數據集合之上的。這節課我們便采用一個叫做 fashion_mnist 數據集合進行模型的構建與訓練。
1. 什么是 fashion_mnist 數據集合
作為機器學習中最基本的數據集合之一, fashion_mnist 數據集一直是入門者做程序測試的首選的數據集,相比較傳統的 mnist 數據集而言,fashion_mnist 數據集更加豐富,能夠更好的反映網絡模型的構建的效果。
fashion_mnist 數據集合是一個包含 70000 個數據的數據集合,其中60000 條數據為訓練集合,10000 條數據為測試集合;每個數據都是 28*28 的灰度圖片數據,而每個數據的標簽分為 10 個類別。其中的幾條數據具體如下圖所示(圖片來自于 TensorFlow 官方 API 文檔)。
我們要做的就是如何根據輸入的圖片訓練模型,從而使得模型可以根據輸入的圖片來預測其屬于哪一個類別。
fashion_mnist 數據集合的 10 個類別為:
["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
2. TensorFlow一般程序結構
TensorFlow 一般的程序的結構都是以下的順序:
- 引入所需要的包
- 加載并預處理數據
- 編寫模型結構
- 編譯模型或 Build 模型
- 訓練模型與保存模型
- 評估模型
在這個簡單的示例之中我們不會涉及到模型的保存與加載,我們只是帶領大家熟習一下程序的整體結構即可。
具體的程序代碼為:
import tensorflow as tf
# 使用內置的數據集合來加載數據
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
# 預處理圖片數據,使其歸一化
x_train, x_test = x_train / 255.0, x_test / 255.0
# 定義網絡結構
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 編譯模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, epochs=5)
# 評估模型
model.evaluate(x_test, y_test)
接下來讓我們仔細地看一下這些代碼到底干了什么。
在該程序之中,我們首先使用 tf.keras 中的 datasets 載入了fashion_mnist 數據集合,該函數返回的是兩個元組:
- 第一個元組為(訓練數據的圖片,訓練數據的標簽)
- 第二個元組為(測試數據的圖片,測試數據的標簽)
因此我們能夠使用兩個元組來接收我們要訓練的數據集合。
然后我們對圖片進行了預處理:
x_train, x_test = x_train / 255.0, x_test / 255.0
在機器學習之中,我們一般將我們的輸入數據規范到 [0 ,1] 之間,因為這樣會讓模型的訓練效果更好。又因為圖片數據的每個像素都是 [0, 255] 的整數,因此我們可以將所有的圖片數據除以 255 ,從而進行歸一化。
接下來我們便構建了我們的模型,我們的模型由三層組成:
- Flatten 層,這一層負責將二維的圖片數據變成一維的數組數據,比如我們輸入的圖片數據為 28*28 的二維數組,那么 Flatten 層將會把其變為長度為 784 的一維數組。
- Dense 層,全連接層,這一層的單元數為 10 個,分別對應著我們的 10 個類別標簽,激活函數為 “softmax” ,表示它會計算每個類別的可能性,從而取可能性最大的類別作為輸出的結果。
然后我們便進行了模型的編譯工作,在編譯的過程中我們有以下幾點需要注意:
- 優化器的選擇,優化器代表著如何對網絡中的參數進行優化,這里采用的是 “adam” 優化器,也是一種最普遍的優化器。
- 損失函數,損失函數意味著我們如何對“模型判斷錯誤的懲罰”的衡量方式;換句話說,我們可以暫且理解成損失函數表示“模型判斷出錯的程度”。對于這種分類的問題,我們一般采用的是 “sparse_categorical_crossentropy” 交叉熵來衡量。
- Metrics,表示我們在訓練的過程中要記錄的數據,在這里我們記錄了 “accuracy” ,也就是準確率。
再者我們進行模型的訓練,我們使用我們預先加載好的數據進行模型的訓練,在這里我們設置訓練的循環數( epoch )為 5,表示我們會在數據集上循環 5 次。
最后我們進行模型的評估,我們使用 x_test, y_test 對我們的模型進行相應的評估。
3. 程序的輸出
通過運行上面的程序,我們可以得到下面的輸出:
Epoch 1/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.4865 - accuracy: 0.8283
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3644 - accuracy: 0.8693
Epoch 3/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3287 - accuracy: 0.8795
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3048 - accuracy: 0.8874
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2864 - accuracy: 0.8938
313/313 - 0s - loss: 0.3474 - accuracy: 0.8752
[0.3474471867084503, 0.8751999735832214]
由此可以看出,在訓練集合上我們可以得到的最高的準確率為 87.52%,在測試集合上面的準確率為 87.519997%。
4. 小結
TesnorFlow 程序的構建主要分為三大部分:數據預處理、模型構建、模型訓練。
而在以后的實踐過程中我們也總是離不開這個程序順序,更加深入的定制化無非就是在這三個大的過程中增添一些細節,因此我們大家要謹記這個總體步驟。