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
廣告
© . All rights reserved.