更新時間:2023-03-07 來源:黑馬程序員 瀏覽量:
在sklearn中,模型都是現(xiàn)成的。tf.Keras是一個神經(jīng)網(wǎng)絡庫,我們需要根據(jù)數(shù)據(jù)和標簽值構建神經(jīng)網(wǎng)絡。神經(jīng)網(wǎng)絡可以發(fā)現(xiàn)特征與標簽之間的復雜關系。神經(jīng)網(wǎng)絡是一個高度結構化的圖,其中包含一個或多個隱藏層。每個隱藏層都包含一個或多個神經(jīng)元。神經(jīng)網(wǎng)絡有多種類別,該程序使用的是密集型神經(jīng)網(wǎng)絡,也稱為全連接神經(jīng)網(wǎng)絡:一個層中的神經(jīng)元將從上一層中的每個神經(jīng)元獲取輸入連接。例如,圖 2 顯示了一個密集型神經(jīng)網(wǎng)絡,其中包含 1 個輸入層、2 個隱藏層以及 1 個輸出層,如下圖所示:
上圖 中的模型經(jīng)過訓練并饋送未標記的樣本時,它會產(chǎn)生 3 個預測結果:相應鳶尾花屬于指定品種的可能性。對于該示例,輸出預測結果的總和是 1.0。該預測結果分解如下:山鳶尾為 0.02,變色鳶尾為 0.95,維吉尼亞鳶尾為 0.03。這意味著該模型預測某個無標簽鳶尾花樣本是變色鳶尾的概率為 95%。
TensorFlow tf.keras API 是創(chuàng)建模型和層的首選方式。通過該 API,您可以輕松地構建模型并進行實驗,而將所有部分連接在一起的復雜工作則由 Keras 處理。
tf.keras.Sequential 模型是層的線性堆疊。該模型的構造函數(shù)會采用一系列層實例;在本示例中,采用的是 2 個密集層(分別包含 10 個節(jié)點)以及 1 個輸出層(包含 3 個代表標簽預測的節(jié)點)。第一個層的 input_shape 參數(shù)對應該數(shù)據(jù)集中的特征數(shù)量:
# 利用sequential方式構建模型model = Sequential([ # 隱藏層1,激活函數(shù)是relu,輸入大小有input_shape指定 Dense(10, activation="relu", input_shape=(4,)), # 隱藏層2,激活函數(shù)是relu Dense(10, activation="relu"), # 輸出層 Dense(3,activation="softmax")])
通過model.summary可以查看模型的架構:
激活函數(shù)可決定層中每個節(jié)點的輸出形狀。這些非線性關系很重要,如果沒有它們,模型將等同于單個層。激活函數(shù)有很多,但隱藏層通常使用 ReLU。
隱藏層和神經(jīng)元的理想數(shù)量取決于問題和數(shù)據(jù)集。與機器學習的多個方面一樣,選擇最佳的神經(jīng)網(wǎng)絡形狀需要一定的知識水平和實驗基礎。一般來說,增加隱藏層和神經(jīng)元的數(shù)量通常會產(chǎn)生更強大的模型,而這需要更多數(shù)據(jù)才能有效地進行訓練。
模型訓練和預測
在訓練和評估階段,我們都需要計算模型的損失。這樣可以衡量模型的預測結果與預期標簽有多大偏差,也就是說,模型的效果有多差。我們希望盡可能減小或優(yōu)化這個值,所以我們設置優(yōu)化策略和損失函數(shù),以及模型精度的計算方法:
# 設置模型的相關參數(shù):優(yōu)化器,損失函數(shù)和評價指標mode l.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])
接下來與在sklearn中相同,分別調(diào)用fit和predict方法進行預測即可。
# 模型訓練:epochs,訓練樣本送入到網(wǎng)絡中的次數(shù),batch_size:每次訓練的送入到網(wǎng)絡中的樣本個數(shù) model.fit(train_X, train_y_ohe, epochs=10, batch_size=1, verbose=1);
上述代碼完成的是:
1. 迭代每個epoch。通過一次數(shù)據(jù)集即為一個epoch。
2. 在一個epoch中,遍歷訓練 Dataset 中的每個樣本,并獲取樣本的特征 (x) 和標簽 (y)。
3. 根據(jù)樣本的特征進行預測,并比較預測結果和標簽。衡量預測結果的不準確性,并使用所得的值計算模型的損失和梯度。
4. 使用 optimizer 更新模型的變量。
5. 對每個epoch重復執(zhí)行以上步驟,直到模型訓練完成。
訓練過程展示如下:
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()方法,返回的是損失函數(shù)和在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的使用有了一個基本的認知,在接下來的課程中會給大家解釋神經(jīng)網(wǎng)絡以及在計算機視覺中的常用的CNN的使用。