2017 年 1 月
第 32 卷,第 1 期
本文章是由機器翻譯。
機器學習服務 - 探索 Microsoft CNTK 機器學習工具
Microsoft 運算網路工具組 (CNTK) 是一個非常強大的命令列系統可以預測系統建立類神經網路。CNTK 的原始開發在 Microsoft 內部使用,因為文件是有點令人卻步。在本文中我逐步引導您安裝 CNTK、 設定示範預測問題、 建立類神經網路模型、 做出預測,以及解譯結果的程序。
[圖 1可讓您了解哪些 CNTK 是及預覽這篇文章方向的位置。雖然不可見的映像中,輸入命令,即可執行這個 CNTK 工具︰
> cntk.exe configFile=MakeModel.cntk makeMode=false
[圖 1 CNTK 作用中
圖中顯示輸出訊息的最後一個部分。具有.cntk 延伸組態檔包含有關輸入檔和要使用的類神經網路設計。預測模型已建立並儲存到磁碟。
建立預測模型之後,我使用它來進行預測。輸入值都是檔案 NewData.txt 且 (4.0,7.0)。第二個組態檔名為 MakePrediction.cntk 使用 CNTK 工具來計算預測。預測結果已儲存至檔案 Prediction_txt.pn 且 0.271139、 0.728821 (0.000040),這表示預測的結果是三個可能的輸出值的秒數。
本文假設您已熟悉使用命令列程式與粗略的了解類神經網路功能,但不會假設您在機器學習 (ML) 的專家或對 CNTK 一無所知。您也可以從下載取得程式碼和資料。
設定問題
想像一下您想要用來預測某人的政治傳閱簡報 (保守中, 度,盡量) 年齡與年收入。這稱為分類問題。其概念是接受一些資料與已知的值,並建立預測模型。在這裡,您可以將複雜的數學函式接受兩個輸入的數值,然後發出值,指出三個類別其中一種形式的模型。
現在看一下圖形中**[圖 2**。有 24 資料點。兩個輸入的變數,在 ML 術語中稱為功能而 x0 x1。三種色彩表示三個不同的類別,在 ML 術語中稱為標籤。雖然使用者互動,可以快速查看一種模式,嘗試建立預測模型,即使這個簡單的資料集是非常具有挑戰性的電腦系統。
[圖 2 訓練資料
CNTK 使用中顯示的資料之後**[圖 2若要建立類神經網路的預測模型,模型將套用至所示的九個測試資料點[圖 3**。如您所見,CNTK 正確預測出九個測試案例的八個。測試項目在 8.0 (8.0),這是實際類別"red,"將會不正確預測為類別"blue"。
[圖 3 的測試資料 (開啟圓形)
安裝 CNTK
安裝 CNTK 是只要的.zip 資料夾從 GitHub 下載並解壓縮檔案。主要的 CNTK 入口網站位於github.com/Microsoft/CNTK。在該頁面中,您可以找到最新的版本的連結 (github.com/Microsoft/CNTK/releases)。CNTK 能力金鑰的其中之一是,它可以使用 GPU 而不是您電腦的 CPU。[發行] 頁面可讓您選擇下載 CPU 專用的版本或 GPU + CPU 版本的二進位檔。
基於示範目的,我建議您選取 CPU 專用的版本,即使您可以直接使用顆 CPU 的 CPU GPU + 版本。按一下 [發行] 頁面上的相關連結將帶您前往一個頁面,您必須接受某些授權條款,並按一下 [接受] 按鈕後,就會顯示一個對話方塊,您儲存檔案的名稱類似 CNTK-1-6-Windows-64bit-CPU-Only.zip (版本號碼也可能不同,當然) 到您的電腦。
將.zip 檔案下載到您的桌面或是任何方便的目錄。解壓縮所有檔案直接 c︰ 磁碟機 (最常見的) 或 C:\Program Files 目錄。
解壓縮的下載將有一個名為 cntk 的單一根目錄。這個根目錄會包含數個目錄,包含另一個目錄也稱為 cntk,其中包含所有二進位檔,其中包括金鑰 cntk.exe 檔案。若要完成安裝程序,加入至系統路徑環境變數 (通常 C:\cntk\cntk) cntk.exe 檔案中的路徑。
建立資料檔案
若要建立並執行 CNTK 專案,您需要組態檔副檔名為.cntk 和至少一個包含定型資料的檔案。大部分 CNTK 專案也會有測試資料的檔案。此外,CNTK 工具執行專案時,會建立數個輸出檔案。
有許多方式來組織與 CNTK 專案所使用的檔案。我建議您建立專案的根目錄存放資料檔案和.cntk 組態檔,並從該目錄執行 CNTK。
我在我的電腦上有現有 C:\Data 的目錄。示範,我會在該目錄中名為 CNTK_Projects 建立新的子目錄。並在該目錄建立名為 SimpleNeuralNet 做為示範專案的根目錄存放我.cntk 檔案和訓練資料檔案和測試資料檔案的子目錄。
CNTK 系統可以使用許多不同類型的資料檔案。範例將使用簡單的文字檔。開啟 [記事本] 的執行個體,並使用從 24 資料項目**[圖 4**,或手動建立的資料中的資訊**[圖 2**,然後將檔案儲存為 TrainData.txt SimpleNeuralNet 目錄。
[圖 4 訓練資料
|features 1.0 5.0 |labels 1 0 0
|features 1.0 2.0 |labels 1 0 0
|features 3.0 8.0 |labels 1 0 0
|features 4.0 1.0 |labels 1 0 0
|features 5.0 8.0 |labels 1 0 0
|features 6.0 3.0 |labels 1 0 0
|features 7.0 5.0 |labels 1 0 0
|features 7.0 6.0 |labels 1 0 0
|features 1.0 4.0 |labels 1 0 0
|features 2.0 7.0 |labels 1 0 0
|features 2.0 1.0 |labels 1 0 0
|features 3.0 1.0 |labels 1 0 0
|features 5.0 2.0 |labels 1 0 0
|features 6.0 7.0 |labels 1 0 0
|features 7.0 4.0 |labels 1 0 0
|features 3.0 5.0 |labels 0 1 0
|features 4.0 4.0 |labels 0 1 0
|features 5.0 5.0 |labels 0 1 0
|features 4.0 6.0 |labels 0 1 0
|features 4.0 5.0 |labels 0 1 0
|features 6.0 1.0 |labels 0 0 1
|features 7.0 1.0 |labels 0 0 1
|features 8.0 2.0 |labels 0 0 1
|features 7.0 2.0 |labels 0 0 1
The training data looks like:
|features 1.0 5.0 |labels 1 0 0
|features 1.0 2.0 |labels 1 0 0
. . .
|features 7.0 2.0 |labels 0 0 1
"| 功能 」 標記表示輸入的值和 「 | 標籤 」 標記表示輸出值。「 功能 」 和 「 標籤 」 都不是保留的字,因此您可以使用類似 「 | 預測值 」 和 「 | predicteds"如果您想。可以使用空格或定位字元 (示範資料會使用空格) 分隔的值。類神經網路只了解數值,因此類別標籤喜歡"red"和"blue"必須編碼為數字。類神經網路分類模型使用了稱為 N 1 之編碼方式。這三個可能的類別標籤,您可以使用 1 0 0,第一個類別 (「 紅色 」 的示範中),0 1 0 (「 藍色 」) 的第二個類別 0 0 1 的第三個類別 (「 綠色 」)。它由您來追蹤每個標籤值編碼的方式。
在非示範案例中,您可能不必擔心正規化輸入的資料。在範圍內可大幅不同的輸入的值的情況下,您會取得更好的結果,如果您調整資料,讓所有範圍都都大約相等。例如,假設是人的年齡 (例如 32.0) 且年收入 (例如 $48,500.00) 的輸入的資料。您可能是將所有的年齡值除以 10 前置處理資料,而且由 10000,讓所有的收入值正規化輸入的值,例如 3.20 (4.85)。三個最常見的輸入的資料正規化形式稱為 z 分數標準化、 最小值最大值正規化和重要性順序正規化。
當您建立並儲存 TrainData.txt 檔案之後,建立並將測試資料的下列九個項目儲存為 TestData.txt SimpleNeuralNet 目錄中的檔案︰
|features 1.0 1.0 |labels 1 0 0
|features 3.0 9.0 |labels 1 0 0
|features 8.0 8.0 |labels 1 0 0
|features 3.0 4.0 |labels 0 1 0
|features 5.0 6.0 |labels 0 1 0
|features 3.0 6.0 |labels 0 1 0
|features 8.0 3.0 |labels 0 0 1
|features 8.0 1.0 |labels 0 0 1
|features 9.0 2.0 |labels 0 0 1
了解類神經網路輸入和輸出
若要了解如何使用 CNTK 需要基本的了解類神經網路的是,它會輸出值的計算,以及如何解譯這些輸出值。看看**[圖 5**。下圖顯示對應到展示問題的類神經網路。
[圖 5 類神經網路的輸入和輸出
有兩個保留 8.0 (3.0),值的輸入的節點和三個輸出節點 (0.3090、 0.0055、 0.6854) 的值。網路也有五個隱藏的處理節點。
每個輸入的節點都連接到所有隱藏節點的線條。與每個隱藏的節點都連接到所有的輸出節點的線條。這些線條代表呼叫加權的數字常數。節點會識別使用 0 為基底的索引,因此最上層節點是 [0]。因此,從隱藏 [0] [0] 輸入的加權是 2.41 版,且隱藏 [4] [2] 輸出的權數-0.85。
每個隱藏的節點和每個輸出節點有其他的箭號。這些稱為偏差值。隱藏 [0] 的偏差是-1.42,且輸出 [2] 的偏差-1.03。
輸入輸出計算最佳舉例說明。首先,隱藏節點的值會計算。值 0.1054 中間隱藏的節點,隱藏 [2],並計算方式是加總的產品的所有已連線的輸入和其相關聯的加權數偏差值,然後再花加總的雙曲線正切函數 (tanh):
hidden[2] = tanh( (8.0)(-0.49) + (3.0)(0.99) + 1.04) )
= tanh( -3.92 + 2.98 + 1.04 )
= tanh( 0.1058 )
= 0.1054
Tanh 函式稱為隱藏的層啟用函數。類神經網路可以使用數個不同的啟用函數的其中之一。除了 tanh,其他兩種最常見的羅吉斯 sigmoid (通常簡稱為只是 「 sigmoid 的 」) 並加以改正線性。
在計算所有隱藏的節點值後下, 一個步驟,計算輸出節點。首先,隱藏的節點和其相關聯的加權,連接的產品的總和,加上的偏差值。例如,在此步驟的輸出 [0] 是 1.0653,計算方式為︰
output[0] = (1.0000)(-2.24) + (-0.1253)(1.18) +
(0.1054)(0.55) + (-0.1905)(1.83) +
(-1.0000)(-1.23) + 2.51
= (-2.2400) + (-0.1478) +
(0.0580) + (-0.3486) +
(1.2300) + 2.51
= 1.0653
同樣地,在 [1] 輸出計算為-2.9547,輸出 [2] 則是 1.8619。
接下來,三個初步的輸出值都會經過調整,因此他們加總為 1.0 時,使用了稱為 softmax 函數︰
output[0] = e^1.0653 / (e^1.0653 + e^-2.9547 + e^1.8619)
= 0.3090
output[1] = e^-2.9547 / (e^1.0653 + e^-2.9547 + e^1.8619)
= 0.0055
output[2] = e^1.8619 / (e^1.0653 + e^-2.9547 + e^1.8619)
= 0.6854
這三個值都會解譯為機率。因此,輸入 (8.0、 3.0) 和加權和偏差值指定,輸出是 0.3090、 0.0055 (0.6854)。最大機率是第三個值,因此您預測在此情況下是第三個類別 「 環保 」。
解譯的輸出值的另一種是將它們對應,因此最大機率是其中一個與其他所有人都是零。此範例會取得 (0,0,1),其對應至的編碼值 「 綠色 」。
定型網路呼叫程序可決定的加權和偏差值,這就是 CNTK 做什麼。
建立組態檔
[圖 1讓您了解如何使用 CNTK。在一般的命令殼層中,我會巡覽至 C:\Data\SimpleNeuralNet 在專案根目錄。專案根目錄包含檔案 TrainData.txt 和 TestData.txt 和 MakeModel.cntk 組態檔。執行命令叫用 CNTK 工具︰
> cntk.exe configFile=MakeModel.cntk makeMode=false
您應該記得系統 PATH 變數知道 cntk.exe 程式的位置,因此不需要完整限定。.Cntk 組態檔有許多資訊。MakeMode = false 的參數表示来執行程式,並覆寫任何先前的結果。CNTK 命令列引數不區分大小寫。
[圖 6顯示組態檔的整體結構。完整的清單的組態檔所示**[圖 7。**
[圖 6 的組態檔結構
# MakeModel.cntk
command=Train:WriteProbs:DumpWeights:Test
# system parameters go here
Train = [
action="train"
BrainScriptNetworkBuilder = [
# define network here
]
]
Test = [
# training commands here
]
WriteProbs = [
# output commands here
]
DumpWeights = [
# output commands here
]
[圖 7 訓練設定檔
# MakeModel.cntk
command=Train:WriteProbs:DumpWeights:Test
modelPath = "Model\SimpleNet.snn"
deviceId = -1
dimension = 2
labelDimension = 3
precision = "float"
# =====
Train = [
action="train"
# network description
BrainScriptNetworkBuilder = [
FDim = $dimension$
HDim = 5
LDim = $labelDimension$
# define the neural network
neuralDef (ftrs) = [
W0 = Parameter (HDim, FDim)
b0 = Parameter (HDim, 1)
W1 = Parameter (LDim, HDim)
b1 = Parameter (LDim, 1)
hn = Tanh (W0 * ftrs + b0)
zn = W1 * hn + b1
].zn
# specify inputs
features = Input (FDim)
labels = Input (LDim)
# create network
myNet = neuralDef (features)
# define training criteria and output(s)
ce = CrossEntropyWithSoftmax (labels, myNet)
err = ErrorPrediction (labels, myNet)
pn = Softmax (myNet)
# connect to the NDL system.
featureNodes = (features)
inputNodes = (labels)
criterionNodes = (ce)
evaluationNodes = (err)
outputNodes = (pn)
]
# stochastic gradient descent
SGD = [
epochSize = 0
minibatchSize = 1
learningRatesPerSample = 0.04
maxEpochs = 500
momentumPerMB = 0.90
]
# configuration for reading data
reader = [
readerType = "CNTKTextFormatReader"
file = "TrainData.txt"
input = [
features = [
dim = $dimension$
format = "dense"
]
labels = [
dim = $labelDimension$
format = "dense"
]
]
]
]
# test
Test = [
action = "test"
reader = [
readerType = "CNTKTextFormatReader"
file="TestData.txt"
randomize = "false"
input = [
features = [
dim = $dimension$
format = "dense"
]
labels = [
dim = $labelDimension$
format = "dense"
]
]
]
]
# log the output node values
WriteProbs = [
action="write"
reader=[
readerType="CNTKTextFormatReader"
file="TestData.txt"
input = [
features = [
dim = $dimension$
format = "dense"
]
labels = [
dim = $labelDimension$
format = "dense"
]
]
]
outputPath = "TestProbs_txt"
]
# dump weight and bias values
DumpWeights = [
action = "dumpNode"
printValues = "true"
]
不過,您希望,不過,使用.cntk 延伸模組是標準作法,您可以命名 CNTK 組態檔。您可以使用 # 字元或 / / 不跨越行註解語彙基元。在組態檔的頂端,您會提供分號分隔的執行,四個在此情況下的模組清單︰
command=Train:WriteProbs:DumpWeights:Test
請注意,模組執行的順序不一定要符合所定義的順序。模組名稱 (在此範例中︰ 讓您可以將模組命名為您想,測試定型、 WriteProbs,DumpWeights) 不是關鍵字。請注意,定型模組具有指示動作 = 「 訓練 」。 在這裡,這兩個字是關鍵字。
定型模組會使用訓練資料檔案來建立預測模型,因此大部分的 CNTK 組態檔案將會有一個模組,訓練,其中包含動作名稱通常為 = 「 訓練 」 命令。定型模組會產生模型的資訊寫入磁碟以二進位格式。
測試模組是選擇性,但通常會包含建立模型時。測試模組會使用新建立的預測模型,來評估整體預測精確度和訓練資料的預測錯誤。
WriteProbs 模組是選擇性的。模組會將測試資料欄位的實際預測值寫入專案根目錄中的文字檔。這可讓您查看完全正確預測的測試案例,這不是。
DumpWeights 模組將寫入文字檔案,其中包含類神經網路加權和偏差定義預測模型。發掘出問題的點,並在新的、 先前未察覺的資料進行預測,您可以使用這項資訊。
系統參數
MakeModel.cntk 組態檔設定五個系統參數︰
modelPath = "Model\SimpleNet.snn"
deviceId = -1
dimension = 2
labelDimension = 3
precision = "float"
ModelPath 變數會指定要放置所產生的二進位模型的位置,以及呼叫模型。在這裡,"snn"代表簡單的類神經網路,但您可以使用任何副檔名。DeviceId 變數會告知 CNTK 是否要使用 (-1) 的 CPU 或 GPU (0)。
維度變數輸入向量中指定值的數目。LabelDimension 指定可能的輸出值數目。有效位數的變數可以採用 float 或 double 的值。在大部分情況下 float 是比較理想,因為它可以速度,比雙訓練。
定型模組
示範訓練模組的組態檔中有三個主要小節︰ BrainScriptNetworkBuilder,幣和讀取器。下列子區段會定義類神經網路架構、 如何訓練網路和如何讀取訓練資料。
開始訓練模組定義︰
Train = [
action="train"
BrainScriptNetworkBuilder = [
FDim = $dimension$
HDim = 5
LDim = $labelDimension$
...
定型模組 BrainScriptNetworkBuilder 部分會使用稱為 BrainScript 特殊指令碼語言。變數 FDim、 HDim 和 LDim 保存功能、 隱藏的節點和標籤的類神經網路的節點的數目。這些名稱不是必要項目,因此您無法使用 NumInput、 NumHidden 和 NumOutput 之類的名稱,如果您想。輸入和輸出節點數目取決於問題資料,但是隱藏節點數目是可用的參數,而且必須由試驗。$ 語彙基元是替代運算子。定型模組定義會繼續進行︰
neuralDef (ftrs) = [
W0 = Parameter (HDim, FDim)
b0 = Parameter (HDim, 1)
W1 = Parameter (LDim, HDim)
b1 = Parameter (LDim, 1)
hn = Tanh (W0 * ftrs + b0)
zn = W1 * hn + b1
].zn
...
這是 BrainScript 函式。變數 W0 是保存的隱藏輸入的加權的矩陣。參數的函式表示 「 建構矩陣 」。 變數 b0 存放隱藏的節點的偏差值。BrainScript 中的所有計算矩陣上都執行 b0 是包含一個資料行,而不是陣列的矩陣。
變數 W1 和 b1 保存隱藏-到-輸出加權和輸出節點偏差值。隱藏節點的值會計算到名為 hn 使用的產品和 tanh 函式加總,如前面所述的變數。Zn 變數會保留前 softmax 輸出值。右括號變數點標記法是 BrainScript 函式傳回值的方式。訓練定義會繼續進行︰
features = Input (FDim)
labels = Input (LDim)
myNet = neuralDef (features)
...
在這裡,定義標籤輸出的輸入的功能。變數名稱 「 功能 」 和 「 標籤 」 不是關鍵字,但是它們必須符合的訓練和測試資料檔案中使用的字串。藉由呼叫 neuralDef 函式建立類神經網路。接下來,模組會定義將用於培訓期間的資訊︰
ce = CrossEntropyWithSoftmax (labels, myNet)
err = ErrorPrediction (labels, myNet)
pn = Softmax (myNet)
...
CrossEntropyWithSoftmax 函式會指定如何計算計算輸出值要培訓資料中的實際輸出值時,應該使用交叉 entropy 錯誤。交叉 entropy 錯誤是標準的度量,但平方的誤差是替代方案。
ErrorPrediction 函式會指示 CNTK 計算並顯示預測模型的精確度 (的訓練資料的正確預測的百分比表示) 和交叉 entropy 錯誤以及 perplexity,也就是量值的計算結果的輸出和實際輸出之間的錯誤。
Softmax 函式會指示 CNTK 正規化計算的輸出值,以便讓它們的總和為 1.0,並可解譯為機率。類神經網路分類器,Softmax 會使用除了在極罕見的情況下。定型模組定義已結束︰
...
featureNodes = (features)
inputNodes = (labels)
criterionNodes = (ce)
evaluationNodes = (err)
outputNodes = (pn)
]
在這裡,featureNodes、 inputNodes、 criterionNodes,和 outputNodes,以及選擇性的 evaluationNodes,所需的系統變數與相關聯的使用者定義變數。
隨機梯度下降 (SGD) 的子區段會定義如何 CNTK 將定型類神經網路。在類神經網路的內容,幣通常會呼叫後端傳播。子區段定義如下︰
SGD = [
epochSize = 0
minibatchSize = 1
learningRatesPerSample = 0.04
maxEpochs = 500
momentumPerMB = 0.90
]
EpochSize 變數會指定要使用的訓練資料中有多少。若要使用所有可用的訓練資料表示的特殊值為零。MinibatchSize 變數會指定多少訓練資料來處理每個訓練反覆項目中。值為 1 表示更新加權和偏差處理每個訓練項目之後。這通常稱為 「 線上 」 或 「 隨機 」 的訓練。
如果 minibatchSize 值設定為訓練的項目 (在此示範的情況下 24 小時) 的數字,然後 24 的所有項目會處理及彙總結果,,則只會加權和偏差加以更新。這有時候稱為 「 完整批次 」 或 「 批次 」 訓練。使用一到定型集大小之間的值稱為 「 迷你批次 」 訓練。
LearningRatesPerSample 變數指定的數量調整加權和偏差上每個反覆項目。透過反覆嘗試,必須判斷學習速度,以及幣子區段中的其他參數的值。類神經網路通常是極為敏感的學習速率值 — 例如,使用 0.04 可讓您非常精確的預測系統,但使用 0.039 或 0.041 可以讓您很差的系統。
MaxEpochs 變數指定的訓練執行多少反覆項目。值太小會造成不良的模型 (「 模型資料符合 」),但太多的反覆項目會過度適合定型資料。這會造成模型預測訓練資料很好,但非常不預測新資料。
MomentumPerMB (趨勢電子報,每個小型批次,每 mb,您可能會假設) 是增加或減少的加權和偏差更新的數量的因素。學習速率,就像趨勢電子報值必須由反覆嘗試,並訓練類神經網路通常是非常機密的趨勢電子報的值。0.90 示範所使用的值是預設值,因此可能已省略 momentumPerMB 參數。
示範組態檔的訓練模組結束時,會設定讀取器的子區段的參數值︰
...
reader = [
readerType = "CNTKTextFormatReader"
file = "TrainData.txt"
input = [
features = [ dim = $dimension$; format = "dense" ]
labels = [ dim = $labelDimension$; format = "dense" ]
]
]
] # end Train
CNTK 工具有許多不同類型的不同類型的輸入資料搭配讀取器。示範讀取器的子區段中的參數的意義應該很清楚。請注意,我將多個陳述式放在同一行之前,使用分號分隔字元。
測試模組
總言之,到目前為止,MakeModel.cntk 組態檔會有某些全域系統參數 (例如 modelPath) 加上四個模組︰ DumpWeights 定型、 測試、 WriteProbs。定型模組有三個小節︰ BrainScriptNetworkBuilder,幣,讀取器。
測試模組很 mercifully 非常簡單,因為您所見的**[圖 8**。
[圖 8 測試模組
Test = [
action = "test"
reader = [
readerType="CNTKTextFormatReader"
file = "TestData.txt"
randomize = "false"
input = [
features = [ dim = $dimension$
format = "dense" ]
labels = [ dim = $labelDimension$
format = "dense" ]
]
]
]
除了檔案參數值的定型模組的 「 讀取器 」 小節和隨機設定參數,應符合測試模組的 「 讀取器 」 小節。訓練與幣,是極為重要資料的項目會處理以隨機順序,並是隨機設定的預設值則為 true。但當逐步解說的測試資料就不需要隨機化資料項目的順序。
測試模組會發出一個精確度度量和命令介面的兩個誤差度量。如果您回頭參考**[圖 1**,只是 「 完整動作測試 」 在訊息之前,您會看到︰
err = 0.11111111 * 9
ce = 0.33729280 * 9
perplexity = 1.40114927
Err = 0.1111 * 9 表示,11%九個測試資料項目不正確預測使用模型。換句話說,正確預測出的九個八測試項目。訓練輸出不是,不過,告訴您哪些資料的項目已正確和不正確預測。
Ce = 0.3372 * 9 表示平均交叉 entropy 錯誤 0.3372。CNTK 此簡介,只是視為交叉 entropy 錯誤詞彙,讓較小的值是更好。
Perplexity = 1.4011 是一個次要的度量。您可以將 perplexity 為量值的方式 g 預測是,其中較小的值是更好。比方說,對於如範例所示的三個可能的輸出值,預測是 0.33、 0.33 (0.33),如果您不需要強式的預測完全。Perplexity 在此情況下會 3.0,這是最多三個輸出值。
WriteProbs 模組
示範 CNTK 組態檔中的第三個模組是 WriteProbs。此模組是選擇性的但很有幫助,因為它可讓您對測試資料所做預測的其他資訊。模組定義於**[圖 9**。
圖 9 WriteProbs 模組
WriteProbs = [
action="write"
reader=[
readerType="CNTKTextFormatReader"
file="TestData.txt"
input = [
features = [ dim = $dimension$
format = "dense" ]
labels = [ dim = $labelDimension$
format = "dense" ]
]
]
outputPath = "TestProbs_txt"
]
WriteProbs 模組等同於測試模組,但不包括三個變更。首先,動作參數設為 「 寫入 」 而不是"test"。 第二,已移除 randomize 參數 (因為 false 是預設值)。第三,已加入 outputPath 參數。
WriteProbs 模組執行時,它會寫入指定的檔案來測試資料的確切的輸出值。在此情況下的檔案名稱會有 「.pn 」 附加,因為這是在訓練模組的輸出節點使用的變數名稱。
九個示範的測試項目,TestProbs_txt.pn 檔案的內容如下︰
0.837386 0.162606 0.000008
0.990331 0.009669 0.000000
0.275697 0.724260 0.000042
0.271172 0.728788 0.000040
0.264680 0.735279 0.000041
0.427661 0.572313 0.000026
0.309024 0.005548 0.685428
0.000134 0.000006 0.999860
0.000190 0.000008 0.999801
第三個可能性向量的前三個測試項目,會對應至正確的輸出 (1,0,0) 的因此前兩個測試正確預測的項目。但是第三個可能性向量 (0.27、 0.74、 0.00) 對應至 (0、 1、 0),因此它是不正確的預測。
接下來的三個可能性向量搭配有輸出 (0、 1、 0),因此所有三個預測正確的測試項目。同樣地,最後三個可能性向量搭配 (0,0,1),所以也是正確的預測。
總言之,測試模組會發出精確度和誤差度量殼層,但無法告訴您哪些個別測試的項目正確,或提供您錯誤說明。確切的 WriteProbs 模組寫入輸出檔案的值,您可以使用它們來判斷不正確預測的測試項目。
DumpWeights 模組
示範組態檔中的四個模組的最後一個是 DumpWeights,其定義如下︰
DumpWeights = [
action = "dumpNode"
printValues = "true"
]
在執行時,此模組會儲存已訓練的模型加權和偏差值檔案。根據預設,檔名是二元模型 (SimpleNet.snn 示範中) 相同與 「。 __AllNodes__.txt 」 附加,和檔案會儲存在 modelPath 參數 (在此示範中為 「 模型 」) 所指定的目錄。
執行之後 MakeModel.cntk 示範,如果您開啟檔案總管] 並指向目錄 \SimpleNeuralNet\Model,您會看到 503 檔案︰
SimpleNet.snn
SimpleNet.snn.__AllNodes__.txt
SimpleNet.snn.0
...
SimpleNet.snn.499
SimpleNet.ckp
SimpleNet.snn 是 CNTK 以使用二進位格式儲存的定型的模型。名稱以數字,最後 500 個檔案和一個 「.ckp"副檔名的檔案是二進位的檢查點檔案。這意思是,訓練複雜的類神經網路可以需要幾小時甚至幾天。還記得這個示範將 maxEpochs 參數設定為 500。CNTK 工具定期儲存訓練資訊,以防系統失敗,您不需要重新啟動重新訓練。
是的前半段示範 AllNodes__.txt 檔案的內容 (與移除的幾行)︰
myNet.b0=LearnableParameter [5,1]
-1.42185283
1.84464693
1.04422486
2.57946277
1.65035748
################################################
myNet.b1=LearnableParameter [3,1]
2.51937032
-1.5136646
-1.03768802
這些是隱藏的節點偏差 (b0) 和輸出節點偏差 (b1) 的值。如果您回頭參考中的類神經網路圖表**[圖 4**,您會看到,這些值會被截斷為兩個小數位數。AllNodes__.txt 檔案的第二部分如下所示︰
myNet.W0=LearnableParameter [5,2]
2.41520381 -0.806418538
-0.561291218 0.839902222
-0.490522146 0.995252371
-0.740959883 1.05180109
-2.72802472 2.81985259
#################################################
myNet.W1=LearnableParameter [3,5]
-2.246624 1.186315 0.557211 1.837152 -1.232379
0.739416 0.814771 1.095480 0.386835 2.120146
1.549207 -1.959648 -1.627967 -2.235190 -0.850726
請注意,展示網路有兩個輸入的值,有五個隱藏的節點三個輸出節點。因此,有 2 * 5 = 10 /w0 中的隱藏輸入加權且有 5 * 3 = 15 W1 中的隱藏-到-輸出加權。
做出預測
定型的模型之後,您可以使用它來進行預測。方法之一是使用 CNTK 工具與"eval"動作模組。示範會使用此方法。首先,建立一組新的資料與單一項目並儲存為檔案 NewData.txt:
|features 4.0 7.0 |labels -1 -1 -1
因為這是新的資料,輸出標籤會使用空的-1 值。接下來,我會建立名為 MakePrediction.cntk 名為預測和 WriteProbs 的兩個模組的組態檔。完整的檔案所示圖 10。
[圖 10 做出預測
# MakePrediction.cntk
stderr = "Log" # write all messages to file
command=Predict:WriteProbs
modelPath = "Model\SimpleNet.snn" # where to find model
deviceId = -1
dimension = 2
labelDimension = 3
precision = "float"
Predict = [
action = "eval"
reader = [
readerType="CNTKTextFormatReader"
file="NewData.txt"
input = [
features = [ dim = $dimension$; format = "dense" ]
labels = [ dim = $labelDimension$; format = "dense" ]
]
]
]
WriteProbs = [
action="write"
reader=[
readerType="CNTKTextFormatReader"
file="NewData.txt"
input = [
features = [ dim = $dimension$; format = "dense" ]
labels = [ dim = $labelDimension$; format = "dense" ]
]
]
outputPath = "Prediction_txt" # dump with .pn extension
]
當執行時,輸出機率會儲存在名為 Prediction_txt.pn,其中包含的檔案︰
0.271139 0.728821 0.000040
這會對應到輸出 (0、 1、 0),也就是"blue"。 如果您看一下培訓資料中**[圖 2**,您可以看到 (4.0,7.0) 可以很輕易就"red"(1,0,0) 或"blue"(0、 1、 0)。
兩個替代的技術,可利用定型的模型是 CNTK 模型評估程式庫中,使用 C# 程式,或使用自訂的 Python 指令碼直接使用的模型加權和偏差值。
總結
我所知的最佳,CNTK 是已正式推出開發人員的 windows 功能最強大的類神經網路系統。這篇文章已涵蓋極小部分的 CNTK 可以做什麼,但應該足以讓您順利執行簡單的類神經網路,並讓您了解文件。深度類神經網路使用來自 CNTK 的真正威力,有兩個或多個隱藏的層和節點間的連線可能是複雜的網路。
CNTK 工具是在使用中的開發,因此閱讀這篇文章的時間已變更的某些細節。不過,CNTK 小組會告訴我,很可能是次要變更,您應該能夠修改不需要太多困難本文中示範。
Dr。James McCaffrey適用於在美國華盛頓州 Redmond 的 Microsoft Research 他曾在數個 Microsoft 產品,包括 Internet Explorer 和 Bing。Dr。可以連線到 McCaffrey jammc@microsoft.com。
感謝下列 Microsoft 技術專家檢閱這份文件︰ Adam Eversole、 John Krumm、 Frank Seide 和 Adam Shirey