天天看點

深度學習:tf.keras實作模型搭建、模型訓練和預測

作者:黑馬程式員

在sklearn中,模型都是現成的。tf.Keras是一個神經網絡庫,我們需要根據資料和标簽值建構神經網絡。神經網絡可以發現特征與标簽之間的複雜關系。神經網絡是一個高度結構化的圖,其中包含一個或多個隐藏層。每個隐藏層都包含一個或多個神經元。神經網絡有多種類别,該程式使用的是密集型神經網絡,也稱為全連接配接神經網絡:一個層中的神經元将從上一層中的每個神經元擷取輸入連接配接。例如,圖 2 顯示了一個密集型神經網絡,其中包含 1 個輸入層、2 個隐藏層以及 1 個輸出層,如下圖所示:

深度學習:tf.keras實作模型搭建、模型訓練和預測

上圖 中的模型經過訓練并饋送未标記的樣本時,它會産生 3 個預測結果:相應鸢尾花屬于指定品種的可能性。對于該示例,輸出預測結果的總和是 1.0。該預測結果分解如下:山鸢尾為 0.02,變色鸢尾為 0.95,維吉尼亞鸢尾為 0.03。這意味着該模型預測某個無标簽鸢尾花樣本是變色鸢尾的機率為 95%。

TensorFlow tf.keras API 是建立模型和層的首選方式。通過該 API,您可以輕松地構模組化型并進行實驗,而将所有部分連接配接在一起的複雜工作則由 Keras 處理。

tf.keras.Sequential 模型是層的線性堆疊。該模型的構造函數會采用一系列層執行個體;在本示例中,采用的是 2 個密集層(分别包含 10 個節點)以及 1 個輸出層(包含 3 個代表标簽預測的節點)。第一個層的 input_shape 參數對應該資料集中的特征數量:

# 利用sequential方式構模組化型model = Sequential([
  # 隐藏層1,激活函數是relu,輸入大小有input_shape指定
  Dense(10, activation="relu", input_shape=(4,)),  
  # 隐藏層2,激活函數是relu
  Dense(10, activation="relu"),
  # 輸出層
  Dense(3,activation="softmax")])           

通過model.summary可以檢視模型的架構:

激活函數可決定層中每個節點的輸出形狀。這些非線性關系很重要,如果沒有它們,模型将等同于單個層。激活函數有很多,但隐藏層通常使用 ReLU。

隐藏層和神經元的理想數量取決于問題和資料集。與機器學習的多個方面一樣,選擇最佳的神經網絡形狀需要一定的知識水準和實驗基礎。一般來說,增加隐藏層和神經元的數量通常會産生更強大的模型,而這需要更多資料才能有效地進行訓練。

模型訓練和預測

在訓練和評估階段,我們都需要計算模型的損失。這樣可以衡量模型的預測結果與預期标簽有多大偏差,也就是說,模型的效果有多差。我們希望盡可能減小或優化這個值,是以我們設定優化政策和損失函數,以及模型精度的計算方法:

# 設定模型的相關參數:優化器,損失函數和評價名額mode
l.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])           

接下來與在sklearn中相同,分别調用fit和predict方法進行預測即可。

# 模型訓練:epochs,訓練樣本送入到網絡中的次數,batch_size:每次訓練的送入到網絡中的樣本個數
model.fit(train_X, train_y_ohe, epochs=10, batch_size=1, verbose=1);           

上述代碼完成的是:

1. 疊代每個epoch。通過一次資料集即為一個epoch。

2. 在一個epoch中,周遊訓練 Dataset 中的每個樣本,并擷取樣本的特征 (x) 和标簽 (y)。

3. 根據樣本的特征進行預測,并比較預測結果和标簽。衡量預測結果的不準确性,并使用所得的值計算模型的損失和梯度。

4. 使用 optimizer 更新模型的變量。

5. 對每個epoch重複執行以上步驟,直到模型訓練完成。

訓練過程展示如下:

Epoch 1/10
75/75 [==============================] - 0s 616us/step - loss: 0.0585 - accuracy: 0.9733
Epoch 2/10
75/75 [==============================] - 0s 535us/step - loss: 0.0541 - accuracy: 0.9867
Epoch 3/10
75/75 [==============================] - 0s 545us/step - loss: 0.0650 - accuracy: 0.9733
Epoch 4/10
75/75 [==============================] - 0s 542us/step - loss: 0.0865 - accuracy: 0.9733
Epoch 5/10
75/75 [==============================] - 0s 510us/step - loss: 0.0607 - accuracy: 0.9733
Epoch 6/10
75/75 [==============================] - 0s 659us/step - loss: 0.0735 - accuracy: 0.9733
Epoch 7/10
75/75 [==============================] - 0s 497us/step - loss: 0.0691 - accuracy: 0.9600
Epoch 8/10
75/75 [==============================] - 0s 497us/step - loss: 0.0724 - accuracy: 0.9733
Epoch 9/10
75/75 [==============================] - 0s 493us/step - loss: 0.0645 - accuracy: 0.9600
Epoch 10/10
75/75 [==============================] - 0s 482us/step - loss: 0.0660 - accuracy: 0.9867           

與sklearn中不同,對訓練好的模型進行評估時,與sklearn.score方法對應的是tf.keras.evaluate()方法,傳回的是損失函數和在compile模型時要求的名額:

# 計算模型的損失和準确率
loss, accuracy = model.evaluate(test_X, test_y_ohe, verbose=1)
print("Accuracy = {:.2f}".format(accuracy))           

分類器的準确率為:

3/3 [==============================] - 0s 591us/step - loss: 0.1031 - accuracy: 0.9733
Accuracy = 0.97           

到此我們對tf.kears的使用有了一個基本的認知,在接下來的課程中會給大家解釋神經網絡以及在計算機視覺中的常用的CNN的使用。

繼續閱讀