搭配 C#/.NET API 使用 CNTK
CNTK v2.2.0 提供 C# API 來建置、定型及評估 CNTK 模型。 本節提供 CNTK C# API 的概觀。 C# 訓練範例 可在 CNTK github 存放庫中取得。
使用 C#/.NET 受控 API 來建置深度類神經網路
CNTK C# API 在 CNTKLib 命名空間中提供基本作業。 CNTK 作業會採用一或兩個具有必要參數的輸入變數,並產生 CNTK 函式。 CNTK 函式會將輸入資料對應至輸出。 CNTK 函式也可以視為變數,並視為另一個 CNTK 作業的輸入。 透過這項機制,您可以藉由鏈結和組合,使用基本的 CNTK 作業來建置深度神經網路。 例如:
private static Function CreateLogisticModel(Variable input, int numOutputClasses)
{
Parameter bias = new Parameter(new int[]{numOutputClasses}, DataType.Float, 0}
Parameter weights = new Parameter(new int[]{input.Shape[0], numOutputClasses}, DataType.Float,
CNTKLib.GlorotUniformInitializer(
CNTKLib.DefaultParamInitScale,
CNTKLib.SentinelValueForInferParamInitRank,
CNTKLib.SentinelValueForInferParamInitRank, 1));
var z = CNTKLib.Plus(bias, CNTKLib.Times(weights, input));
Function logisticClassifier = CNTKLib.Sigmoid(z, "LogisticClassifier");
return logisticClassifier;
}
CNTKLib.Plus、CNTKLib.Times、CNTKLib.Sigmoid 是基本的 CNTK 作業。 輸入引數可以是代表資料特徵的 CNTK 變數。 它也可能是另一個 CNTK 函式。 此程式碼會建置簡單的計算網路,其中包含在定型階段調整的參數,讓多類別分類器成為良好的分類器。
CNTK C# API 提供作業來建置卷積神經網路, (CNN) 和遞迴神經網路 (RNN) 。 例如,若要建置兩層 CNN 影像分類器:
var convParams1 = new Parameter(
new int[] { kernelWidth1, kernelHeight1, numInputChannels, outFeatureMapCount1 },
DataType.Float, CNTKLib.GlorotUniformInitializer(convWScale, -1, 2), device);
var convFunction1 = CNTKLib.ReLU(CNTKLib.Convolution(
convParams1, input,
new int[] { 1, 1, numInputChannels } ));
var pooling1 = CNTKLib.Pooling(convFunction1, PoolingType.Max,
new int[] { poolingWindowWidth1, poolingWindowHeight1 }, new int[] { hStride1, vStride1 }, new bool[] { true });
var convParams2 = new Parameter(
new int[] { kernelWidth2, kernelHeight2, outFeatureMapCount1, outFeatureMapCount2 },
DataType.Float, CNTKLib.GlorotUniformInitializer(convWScale, -1, 2), device);
var convFunction2 = CNTKLib.ReLU(CNTKLib.Convolution(
convParams2, pooling1,
new int[] { 1, 1, outFeatureMapCount1 } ));
var pooling2 = CNTKLib.Pooling(convFunction2, PoolingType.Max,
new int[] { poolingWindowWidth2, poolingWindowHeight2 }, new int[] { hStride2, vStride2 }, new bool[] { true });
var imageClassifier = TestHelper.Dense(pooling2, numClasses, device, Activation.None, "ImageClassifier");
也會提供使用長期記憶體 (LTSM) 建置 RNN 的範例。
使用 C#/.NET 進行資料準備
CNTK 提供用於定型的資料準備公用程式。 CNTK C# API 會公開這些公用程式。 它會從各種預處理表單取得資料。 資料載入和批次處理有效率地完成。 例如,假設我們有下列 CNTK 文字格式的資料,稱為 「Train.ctf」:
|features 3.854499 4.163941 |labels 1.000000
|features 1.058121 1.204858 |labels 0.000000
|features 1.870621 1.284107 |labels 0.000000
|features 1.134650 1.651822 |labels 0.000000
|features 5.420541 4.557660 |labels 1.000000
|features 6.042731 3.375708 |labels 1.000000
|features 5.667109 2.811728 |labels 1.000000
|features 0.232070 1.814821 |labels 0.000000
以這種方式建立 CNTK DataSource:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
批次資料可以擷取並用於稍後的定型:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
使用 C#/.NET 受控 API 來定型深度類神經網路
隨機漸層下降 (SGD) 是使用迷你batch 定型資料優化模型參數的方法。 CNTK 支援許多在深度學習檔中常見的 SGD 變化。 它們是由 CNTK C# API 公開:
- SGDLearner - CNTK 內建的 SGD 學習模組
- MomentumSGDLearner - CNTK 內建的 Momentum SGD 學習工具
- FSAdaGradLearner - AdaGrad 學習模組的變化
- AdamLearner - Adam 學習者
- AdaGradLearner - 調適型漸層學習模組
- RMSPropLearner - RMSProp 學習工具
- AdaDeltaLearner - AdaDelta 學習工具
如需不同學習優化器的一般概觀,請參閱 隨機梯度下降。
CNTK 定型器可用來進行迷你Batch 訓練。 迷你批次訓練的C# 程式碼剪貼:
// build a learning model
var featureVariable = Variable.InputVariable(new int[] { inputDim }, DataType.Float);
var labelVariable = Variable.InputVariable(new int[] { numOutputClasses }, DataType.Float);
var classifierOutput = CreateLinearModel(featureVariable, numOutputClasses, device);
var loss = CNTKLib.CrossEntropyWithSoftmax(classifierOutput, labelVariable);
var evalError = CNTKLib.ClassificationError(classifierOutput, labelVariable);
// prepare for training
var learningRatePerSample = new CNTK.TrainingParameterScheduleDouble(0.02, 1);
var parameterLearners =
new List<Learner>() { Learner.SGDLearner(classifierOutput.Parameters(), learningRatePerSample) };
var trainer = Trainer.CreateTrainer(classifierOutput, loss, evalError, parameterLearners);
int minibatchSize = 64;
int numMinibatchesToTrain = 1000;
// train the model
for (int minibatchCount = 0; minibatchCount < numMinibatchesToTrain; minibatchCount++)
{
Value features, labels;
GenerateValueData(minibatchSize, inputDim, numOutputClasses, out features, out labels, device);
trainer.TrainMinibatch(
new Dictionary<Variable, Value>() { { featureVariable, features }, { labelVariable, labels } }, device);
TestHelper.PrintTrainingProgress(trainer, minibatchCount, 50);
}
在此程式碼擷取中,會使用每個樣本學習率 = 0.02 的 CNTK 內建 SGD 學習模組。 學習者是優化模型的所有參數。 系統會使用學習者、遺失函式和評估函式來建立定型器。 在每個定型反復專案迷你批次資料期間,都會傳送給定型器,以更新模型參數。 訓練期間會以協助程式方法顯示定型遺失和評估錯誤。
在程式碼中,我們會產生兩種標籤和特徵的統計可分隔資料類別。 在其他更實際的 範例中,公用測試資料會以 CNTK MinibatchSource 載入。
使用 C#/.NET 受控 API 來評估深度神經網路
C# API 具有評估 API 來執行模型評估。 大部分 的 C# 定型範例 都會在定型之後執行模型評估。
如需更多使用 CNTK C# API 的模型評估詳細資料,請參閱
開始使用 C# 訓練範例
完成此概觀之後,您可以透過兩種方式繼續進行 C# 訓練範例:使用 GitHub 的 CNTK 來源,或使用 CNTK NuGet for Windows 使用 CNTK範例。
使用 CNTK 來源
- 請遵循 此頁面 中的步驟,在視窗上設定 CNTK。
- 使用 Visual Studio 建置 CNTK.sln。
- 準備範例資料。
- 在 CNTKLibraryCSTrainingTest.csproj 中以端對端測試的形式執行範例