通过C#/.NET API使用CNTK
CNTK v2.2.0提供C#API來建立、訓(xùn)練和評(píng)估CNTK模型。 本節(jié)概要介紹了CNTK C#API。 在CNTK github respository中可以找到C#訓(xùn)練示例。
使用C#/ .NET管理API構(gòu)建深層神經(jīng)網(wǎng)絡(luò)
CNTK C#API 通過CNTKLib命名空間提供基本操作。 CNTK操作需要一個(gè)或兩個(gè)具有必要參數(shù)的輸入變量,并產(chǎn)生一個(gè)CNTK函數(shù)。 CNTK函數(shù)將輸入數(shù)據(jù)映射到輸出。 CNTK函數(shù)也可以被視為可變量,并被作為另一個(gè)CNTK操作的輸入。 通過這種機(jī)制,可以通過鏈接和組合來構(gòu)建具有基本CNTK操作的深層神經(jīng)網(wǎng)絡(luò)。 舉個(gè)例子:
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操作。 輸入?yún)?shù)可以是表示數(shù)據(jù)特征的CNTK變量。 它也可能是另一個(gè)CNTK函數(shù)。 該代碼構(gòu)建了一個(gè)簡單的計(jì)算網(wǎng)絡(luò),其參數(shù)在訓(xùn)練階段進(jìn)行調(diào)整,以創(chuàng)建一個(gè)像樣的多類分類器(multi-class classifier)。
CNTK C#API提供了構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)(CNN)和復(fù)發(fā)神經(jīng)網(wǎng)絡(luò)(RNN)的選項(xiàng)。 例如,構(gòu)建一個(gè)2層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");
還提供了構(gòu)建具有長短時(shí)內(nèi)存(LSTM)的RNN的示例。
通過C#/.NET準(zhǔn)備數(shù)據(jù)
CNTK提供用于訓(xùn)練的數(shù)據(jù)準(zhǔn)備工具。 CNTK C#API公開了這些工具。 它可以接受各種預(yù)處理形式的數(shù)據(jù)。 數(shù)據(jù)的加載和批處理數(shù)據(jù)非常高效。 例如,假定我們有以下稱為“Train.ctf”的CNTK文本格式的數(shù)據(jù):
| | |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 |
一個(gè)CNTK數(shù)據(jù)源會(huì)以這種方式被創(chuàng)建:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,MinibatchSource.InfinitelyRepeat, true);批處理數(shù)據(jù)可以在訓(xùn)練的時(shí)候?qū)I(yè)被檢索和使用:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);使用C#/ .NET托管API訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)
隨機(jī)梯度下降(SGD)是利用小型訓(xùn)練數(shù)據(jù)優(yōu)化模型參數(shù)的一種方法。 CNTK支持許多在深入學(xué)習(xí)文獻(xiàn)中常見的SGD變體。 它們通過CNTK C#API公開:
-
SGDLearner - 一個(gè)內(nèi)置CNTK SGD學(xué)習(xí)器
-
MomentumSGDLearner - 內(nèi)置CNTK動(dòng)量SGD學(xué)習(xí)器
-
FSAdaGradLearner -?AdaGrad learner的變體
-
AdamLearner -??Adam learner
-
AdaGradLearner -?自適應(yīng)梯度學(xué)習(xí)器
-
RMSPropLearner - RMSProp學(xué)習(xí)器
-
AdaDeltaLearner -?AdaDelta學(xué)習(xí)器
有關(guān)不同學(xué)習(xí)優(yōu)化器的一般概述,請(qǐng)參閱隨機(jī)梯度下降Stochastic gradient descent.
CNTK訓(xùn)練器用來進(jìn)行minibatch訓(xùn)練。以下是minibatch訓(xùn)練的一段C#diamante片段:
// 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);
? ? }
這段代碼使用了一個(gè)每個(gè)樣本學(xué)習(xí)率為0.02的CNTK內(nèi)置SGD學(xué)習(xí)器, 學(xué)習(xí)器用來為模型參數(shù)做優(yōu)化。 訓(xùn)練器與學(xué)習(xí)器一同創(chuàng)建,一個(gè)是loss函數(shù),一個(gè)是評(píng)估函數(shù)。 在每次訓(xùn)練迭代期間,將小批量數(shù)據(jù)送給訓(xùn)練器以更新模型參數(shù)。 訓(xùn)練期間,訓(xùn)練耗損和評(píng)估誤差由輔助方法顯示。
在代碼中,我們生成了兩類統(tǒng)計(jì)分離的標(biāo)簽和特征數(shù)據(jù)。 在其他更實(shí)際的例子中,公共測試數(shù)據(jù)加載了CNTK MinibatchSource。
使用C#/.NET托管API評(píng)估深度神經(jīng)網(wǎng)絡(luò)
C# API具有評(píng)估API來進(jìn)行模型評(píng)估。多數(shù)訓(xùn)練示例在訓(xùn)練之后需要進(jìn)行模型評(píng)估。?
開始使用C#訓(xùn)練示例
看完這個(gè)概述之后,可以通過兩種方法繼續(xù)C#培訓(xùn)示例:使用GitHub的CNTK源或使用CNTK NuGet for Windows處理CNTK示例。
通過CNTK源碼
-
在windows下通過此頁的步驟來建立CNTK
-
通過VS編譯CNTK.sln
-
準(zhǔn)備示例數(shù)據(jù)
-
在CNTKLibraryCSTrainingTest.csproj中運(yùn)行示例作為端到端測試
通過CNTK NuGet獲取CNTK示例
-
下載CNTK C#訓(xùn)練示例?examples
-
準(zhǔn)備示例數(shù)據(jù).
-
構(gòu)建并運(yùn)行示例
原文地址:http://www.cnblogs.com/lori/p/7659923.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的通过C#/.NET API使用CNTK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: From Agile To DevOps
- 下一篇: C#使用Xamarin开发可移植移动应用