亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

TensorFlow 入門教程

使用 Keras 進行回歸

我們在之前的課程之中學習到的模型都是分類模型,也就是說模型的輸出是某一個類別;而這節課我們來學習回歸模型

1. 回歸模型與分類模型的不同

簡單來說,兩者最直觀的區別就是:回歸模型的輸出是一個連續的數值,而回歸模型的輸出是一個具體的類別。

舉個例子,在生活中:

  • 測量體溫、計算運動時間等都屬于回歸任務;
  • 擲色子、拋硬幣等都屬于分類任務。

但是從整體的程序角度來說,回歸模型又與回歸模型有以下幾個詳細的不同:

  • 激活函數不同,回歸模型的激活函數一般是 Relu 等激活函數,或者沒有激活函數;
  • 損失函數不同,回歸模型的損失函數一般是 MSE 和 RMSE 等損失函數;
  • 衡量標準不再使用準確率,因為回歸任務無法定義準確率。

2. 數據獲取

我們這次采用的任務示例數據是 TensorFlow 的 Keras 內部內置的波士頓房屋價格數據集合,我們會以此數據集合為基礎進行我們的回歸任務模型的構建。

因為該數據集合已經包含在 TensorFlow 之中,因此我們可以直接使用以下語句進行數據集合的下載。

(train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.boston_housing.load_data()

讓我們先來認識一下數據,該數據集合包含:

  • 每個樣本包含13個特征,每個特征表示特定的因素,這些特征包括:
    • CRIM:犯罪率;
    • ZN: 2.5 平凡英尺及其以上的住宅比例;
    • INDUS: 非零售業務地區比例;
    • CHAS:1-土地在河邊,0-土地不在河邊;
    • NOX:一氧化碳濃度;
    • RM:平居每人房子數量;
    • AGE:1940年之前建成的建筑的比例;
    • DIS:與波士頓就業中心的距離;
    • RAD:輻射指標;
    • TAX:稅率指標;
    • PTRATTO:師生比例;
    • B:黑人比例指數;
    • LSTAT:較低地位人群的比例;
  • 每個樣本的標簽是房價 MEDV,采用自有住房的中位數來表示。

我們可以使用以下方式來查看數據的部分內容:

print(train_data.shape)
print(test_data.shape)
print(train_data[0])
print(train_labels[0])

得到的結果為:

(404, 13)
(102, 13)
[1.23247 0. 8.14 0. 0.538 6.142  91.7 3.9769  4. 307. 21. 396.9  18.72]
15.2

3. 模型的構建

在這里我們仍然使用最普通的順序模型來進行表示,于是我們可以得到我們的模型表示為:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(128, activation='relu', input_shape=(13,)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

在該模型之中,前兩層是我們很熟悉的全連接層。

這里值得注意的是在最后一層,因為我們想要輸出一個連續的值,因此我們僅僅使用了一個神經元的全連接層,而且沒有規定激活函數,而實將其簡單輸出。

4. 整體程序與輸出結果

經過了上面兩個步驟,我們已經可以得到我們的程序代碼了,具體如下:

import tensorflow as tf

(train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.boston_housing.load_data()
train_shape = train_data.shape
train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels)).batch(8).shuffle(buffer_size=train_shape[0])
test_dataset = tf.data.Dataset.from_tensor_slices((test_data, test_labels)).batch(8)

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(128, activation='relu', input_shape=(13,)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])
model.summary()
model.compile(optimizer='rmsprop', loss='mse')
model.fit(train_dataset, epochs=60)

result = model.evaluate(test_dataset)
print(result)

在該程序之中,唯一的不同就是該程序的優化器采用了 RMSProp ,與Adam相比,該優化器更加使用于回歸任務。

而且我們的損失函數也采用了均方誤差 (MSE) 的形式來衡量。簡單來說,均方誤差就是用來衡量“模型輸出”與“真實值”之間的距離,MSE 越小則表示該模型的精確度越高,被廣泛應用于回歸任務之中。

該程序的輸出結果為:

Model: "sequential_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_36 (Dense)             (None, 128)               1792      
_________________________________________________________________
dense_37 (Dense)             (None, 64)                8256      
_________________________________________________________________
dense_38 (Dense)             (None, 1)                 65        
=================================================================
Total params: 10,113
Trainable params: 10,113
Non-trainable params: 0
_________________________________________________________________
Epoch 1/40
51/51 [==============================] - 0s 1ms/step - loss: 291.5432
Epoch 2/40
51/51 [==============================] - 0s 1ms/step - loss: 169.2546
Epoch 3/40
51/51 [==============================] - 0s 977us/step - loss: 165.5226
...........................
Epoch 38/40
51/51 [==============================] - 0s 950us/step - loss: 41.2446
Epoch 39/40
51/51 [==============================] - 0s 1ms/step - loss: 40.0520
Epoch 40/40
51/51 [==============================] - 0s 1ms/step - loss: 41.2494
13/13 [==============================] - 0s 1ms/step - loss: 33.5408
33.54079818725586

由此可見,我們的模型在誤差方面已經降低到了 33 的 MSE。

5. 小結

這節課我們學習了回歸任務與分類任務的不同,同時了解了回歸任務常用的 MSE 與 RMSProp 等指標與優化器。最后我們知道了如何使用 TensorFlow 中的 Keras 來構建一個回歸任務的模型。

這節課之中我們自己動手實現了一個回歸模型,雖然比較簡單,但是這卻是回歸任務的基本程序框架。
圖片描述