- Microsoft Cognitive Toolkit (CNTK) 教程
- 首頁
- 介紹
- 入門
- CPU 和 GPU
- CNTK - 序列分類
- CNTK - 邏輯迴歸模型
- 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 - 神經網路訓練
在這裡,我們將瞭解如何在 CNTK 中訓練神經網路。
在 CNTK 中訓練模型
在上一節中,我們已經定義了深度學習模型的所有元件。現在是時候訓練它了。正如我們前面討論的,我們可以使用學習器和訓練器的組合在 CNTK 中訓練 NN 模型。
選擇學習器並設定訓練
在本節中,我們將定義學習器。CNTK 提供了多種學習器可供選擇。對於我們在上一節中定義的模型,我們將使用隨機梯度下降 (SGD) 學習器。
為了訓練神經網路,讓我們透過以下步驟配置學習器和訓練器:
步驟 1 - 首先,我們需要從cntk.learners包中匯入sgd函式。
from cntk.learners import sgd
步驟 2 - 接下來,我們需要從cntk.train.trainer包中匯入Trainer函式。
from cntk.train.trainer import Trainer
步驟 3 - 現在,我們需要建立一個學習器。可以透過呼叫sgd函式並提供模型引數和學習率的值來建立它。
learner = sgd(z.parametrs, 0.01)
步驟 4 - 最後,我們需要初始化訓練器。必須為其提供網路、損失和度量的組合以及學習器。
trainer = Trainer(z, (loss, error_rate), [learner])
控制最佳化速度的學習率應為 0.1 到 0.001 之間的較小數字。
選擇學習器並設定訓練 -完整示例
from cntk.learners import sgd from cntk.train.trainer import Trainer learner = sgd(z.parametrs, 0.01) trainer = Trainer(z, (loss, error_rate), [learner])
將資料饋送到訓練器
一旦我們選擇並配置了訓練器,就該載入資料集了。我們將iris資料集儲存為 .CSV 檔案,我們將使用名為pandas的資料整理包來載入資料集。
從 .CSV 檔案載入資料集的步驟
步驟 1 - 首先,我們需要匯入pandas包。
from import pandas as pd
步驟 2 - 現在,我們需要呼叫名為read_csv的函式來從磁碟載入 .csv 檔案。
df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, index_col=False)
載入資料集後,我們需要將其拆分為一組特徵和標籤。
將資料集拆分為特徵和標籤的步驟
步驟 1 - 首先,我們需要從資料集中選擇所有行和前四列。可以使用iloc函式來完成。
x = df_source.iloc[:, :4].values
步驟 2 - 接下來,我們需要從 iris 資料集中選擇 species 列。我們將使用 values 屬性來訪問底層的numpy陣列。
x = df_source[‘species’].values
將 species 列編碼為數值向量表示的步驟
正如我們前面討論的,我們的模型基於分類,它需要數值輸入值。因此,這裡我們需要將 species 列編碼為數值向量表示。讓我們看看執行此操作的步驟:
步驟 1 - 首先,我們需要建立一個列表表示式來迭代陣列中的所有元素。然後為每個值在 label_mapping 字典中執行查詢。
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
步驟 2 - 接下來,將這個轉換後的數值轉換為獨熱編碼向量。我們將使用one_hot函式,如下所示:
def one_hot(index, length): result = np.zeros(length) result[index] = 1 return result
步驟 3 - 最後,我們需要將這個轉換後的列表轉換為numpy陣列。
y = np.array([one_hot(label_mapping[v], 3) for v in y])
檢測過擬合的步驟
當您的模型記住樣本但無法從訓練樣本中推匯出規則時,這種情況就是過擬合。藉助以下步驟,我們可以檢測模型的過擬合:
步驟 1 - 首先,從sklearn包中,從model_selection模組匯入train_test_split函式。
from sklearn.model_selection import train_test_split
步驟 2 - 接下來,我們需要使用特徵 x 和標籤 y 呼叫 train_test_split 函式,如下所示:
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2, stratify=y)
我們指定 test_size 為 0.2 以留出 20% 的總資料。
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
將訓練集和驗證集饋送到我們的模型的步驟
步驟 1 - 為了訓練我們的模型,首先,我們將呼叫train_minibatch方法。然後為其提供一個字典,該字典將輸入資料對映到我們用於定義 NN 及其關聯損失函式的輸入變數。
trainer.train_minibatch({ features: X_train, label: y_train})
步驟 2 - 接下來,使用以下 for 迴圈呼叫train_minibatch:
for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))
將資料饋送到訓練器 - 完整示例
from import pandas as pd
df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, index_col=False)
x = df_source.iloc[:, :4].values
x = df_source[‘species’].values
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result
y = np.array([one_hot(label_mapping[v], 3) for v in y])
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2, stratify=y)
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
trainer.train_minibatch({ features: X_train, label: y_train})
for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))
測量 NN 的效能
為了最佳化我們的 NN 模型,每當我們將資料傳遞給訓練器時,它都會透過我們為訓練器配置的度量來測量模型的效能。這種在訓練期間對 NN 模型效能的測量是在訓練資料上進行的。但另一方面,為了對模型效能進行全面分析,我們還需要使用測試資料。
因此,為了使用測試資料測量模型的效能,我們可以如下呼叫訓練器上的test_minibatch方法:
trainer.test_minibatch({ features: X_test, label: y_test})
使用 NN 進行預測
訓練深度學習模型後,最重要的事情是使用該模型進行預測。為了對上述經過訓練的 NN 進行預測,我們可以遵循以下步驟:
步驟 1 - 首先,我們需要使用以下函式從測試集中選擇一個隨機專案:
np.random.choice
步驟 2 - 接下來,我們需要使用sample_index從測試集中選擇樣本資料。
步驟 3 - 現在,為了將 NN 的數值輸出轉換為實際標籤,建立一個反向對映。
步驟 4 - 現在,使用選定的sample資料。透過將 NN z 作為函式來進行預測。
步驟 5 - 現在,一旦得到預測輸出,就將具有最高值的 neurons 的索引作為預測值。可以使用numpy包中的np.argmax函式來完成。
步驟 6 - 最後,使用inverted_mapping將索引值轉換為真實標籤。
使用 NN 進行預測 - 完整示例
sample_index = np.random.choice(X_test.shape[0])
sample = X_test[sample_index]
inverted_mapping = {
1:’Iris-setosa’,
2:’Iris-versicolor’,
3:’Iris-virginica’
}
prediction = z(sample)
predicted_label = inverted_mapping[np.argmax(prediction)]
print(predicted_label)
輸出
訓練上述深度學習模型並執行它後,您將獲得以下輸出:
Iris-versicolor