- Microsoft Cognitive Toolkit (CNTK) 教程
- 首頁
- 簡介
- 入門
- CPU 和 GPU
- CNTK - 序列分類
- CNTK - Logistic 迴歸模型
- CNTK - 神經網路 (NN) 概念
- CNTK - 建立第一個神經網路
- CNTK - 訓練神經網路
- CNTK - 記憶體資料集和大型資料集
- CNTK - 效能評估
- 神經網路分類
- 神經網路二元分類
- CNTK - 神經網路迴歸
- CNTK - 分類模型
- CNTK - 迴歸模型
- CNTK - 記憶體不足資料集
- CNTK - 監控模型
- CNTK - 卷積神經網路
- CNTK - 迴圈神經網路
- Microsoft Cognitive Toolkit 資源
- Microsoft Cognitive Toolkit - 快速指南
- Microsoft Cognitive Toolkit - 資源
- Microsoft Cognitive Toolkit - 討論
CNTK - 迴歸模型
在這裡,我們將學習如何評估迴歸模型的效能。
迴歸模型驗證的基礎
眾所周知,迴歸模型與分類模型不同,因為對於單個樣本,沒有對錯的二元衡量標準。在迴歸模型中,我們希望衡量預測值與實際值的接近程度。預測值越接近預期輸出,模型的效能就越好。
在這裡,我們將使用不同的誤差率函式來衡量用於迴歸的 NN 的效能。
計算誤差範圍
如前所述,在驗證迴歸模型時,我們無法判斷預測是正確還是錯誤。我們希望我們的預測儘可能接近真實值。但是,這裡可以接受較小的誤差範圍。
計算誤差範圍的公式如下:
這裡,
預測值 = 用帽子表示的 y
真實值 = 用 y 表示的預測值
首先,我們需要計算預測值和真實值之間的距離。然後,為了獲得整體誤差率,我們需要將這些平方距離相加並計算平均值。這稱為均方誤差函式。
但是,如果我們想要表示誤差範圍的效能指標,我們需要一個表示絕對誤差的公式。平均絕對誤差函式的公式如下:
上述公式取預測值和真實值之間的絕對距離。
使用 CNTK 衡量回歸效能
在這裡,我們將瞭解如何結合使用我們討論的不同指標和 CNTK。我們將使用一個迴歸模型,根據以下步驟預測汽車的每加侖英里數。
實現步驟:
步驟 1 - 首先,我們需要從cntk包中匯入所需的元件,如下所示:
from cntk import default_option, input_variable from cntk.layers import Dense, Sequential from cntk.ops import relu
步驟 2 - 接下來,我們需要使用default_options函式定義一個預設啟用函式。然後,建立一個新的 Sequential 層集並提供兩個具有 64 個神經元的 Dense 層。然後,我們將一個額外的 Dense 層(充當輸出層)新增到 Sequential 層集中,並提供 1 個沒有啟用的神經元,如下所示:
with default_options(activation=relu): model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
步驟 3 - 建立網路後,我們需要建立一個輸入特徵。我們需要確保它與我們將用於訓練的特徵具有相同的形狀。
features = input_variable(X.shape[1])
步驟 4 - 現在,我們需要建立一個另一個大小為 1 的input_variable。它將用於儲存 NN 的預期值。
target = input_variable(1) z = model(features)
現在,我們需要訓練模型,為此,我們將分割資料集並使用以下實現步驟執行預處理:
步驟 5 - 首先,從 sklearn.preprocessing 中匯入 StandardScaler 以獲取 -1 到 +1 之間的值。這將幫助我們防止 NN 中出現梯度爆炸問題。
from sklearn.preprocessing import StandardScalar
步驟 6 - 接下來,從 sklearn.model_selection 中匯入 train_test_split,如下所示:
from sklearn.model_selection import train_test_split
步驟 7 - 使用drop方法從資料集中刪除mpg列。最後,使用train_test_split函式將資料集拆分為訓練集和驗證集,如下所示:
x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32) y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32) scaler = StandardScaler() X = scaler.fit_transform(x) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
步驟 8 - 現在,我們需要建立一個另一個大小為 1 的input_variable。它將用於儲存 NN 的預期值。
target = input_variable(1) z = model(features)
我們已經分割並預處理了資料,現在我們需要訓練 NN。就像在前面的部分建立迴歸模型時一樣,我們需要定義損失和指標函式的組合來訓練模型。
import cntk def absolute_error(output, target): return cntk.ops.reduce_mean(cntk.ops.abs(output – target)) @ cntk.Function def criterion_factory(output, target): loss = squared_error(output, target) metric = absolute_error(output, target) return loss, metric
現在,讓我們看看如何使用訓練好的模型。對於我們的模型,我們將使用 criterion_factory 作為損失和指標組合。
from cntk.losses import squared_error from cntk.learners import sgd from cntk.logging import ProgressPrinter progress_printer = ProgressPrinter(0) loss = criterion_factory (z, target) learner = sgd(z.parameters, 0.001) training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)
完整的實現示例
from cntk import default_option, input_variable from cntk.layers import Dense, Sequential from cntk.ops import relu with default_options(activation=relu): model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)]) features = input_variable(X.shape[1]) target = input_variable(1) z = model(features) from sklearn.preprocessing import StandardScalar from sklearn.model_selection import train_test_split x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32) y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32) scaler = StandardScaler() X = scaler.fit_transform(x) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) target = input_variable(1) z = model(features) import cntk def absolute_error(output, target): return cntk.ops.reduce_mean(cntk.ops.abs(output – target)) @ cntk.Function def criterion_factory(output, target): loss = squared_error(output, target) metric = absolute_error(output, target) return loss, metric from cntk.losses import squared_error from cntk.learners import sgd from cntk.logging import ProgressPrinter progress_printer = ProgressPrinter(0) loss = criterion_factory (z, target) learner = sgd(z.parameters, 0.001) training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)
輸出
------------------------------------------------------------------- average since average since examples loss last metric last ------------------------------------------------------ Learning rate per minibatch: 0.001 690 690 24.9 24.9 16 654 636 24.1 23.7 48 [………]
為了驗證我們的迴歸模型,我們需要確保模型處理新資料的方式與處理訓練資料的方式一樣好。為此,我們需要在損失和指標組合上呼叫test方法,並使用測試資料,如下所示:
loss.test([X_test, y_test])
輸出:
{'metric': 1.89679785619, 'samples': 79}