通過C#/.NET API使用CNTK

來源:互聯網
上載者:User

標籤:mes   cspro   tran   輸出   tin   desc   list   iba   nuget   

(原文)CNTK v2.2.0提供C#API來建立、訓練和評估CNTK模型。 本節概要介紹了CNTK C#API。 在CNTK github respository中可以找到C#訓練樣本。

使用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函數。 該代碼構建了一個簡單的計算網路,其參數在訓練階段進行調整,以建立一個像樣的多類分類器(multi-class classifier)。

CNTK C#API提供了構建卷積神經網路(CNN)和複發神經網路(RNN)的選項。 例如,構建一個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");

還提供了構建具有長短時記憶體(LSTM)的RNN的樣本。

通過C#/.NET準備資料

CNTK提供用於訓練的資料準備工具。 CNTK C#API公開了這些工具。 它可以接受各種預先處理形式的資料。 資料的載入和批處理資料非常高效。 例如,假定我們有以下稱為“Train.ctf”的CNTK文字格式設定的資料:

|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資料來源會以這種方式被建立:

var minibatchSource = MinibatchSource.TextFormatMinibatchSource(        Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,        MinibatchSource.InfinitelyRepeat, true);

批處理資料可以在訓練的時候專業被檢索和使用:

var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);

使用C#/ .NET託管API訓練深層神經網路

隨機梯度下降(SGD)是利用小型訓練資料最佳化模型參數的一種方法。 CNTK支援許多在深入學習文獻中常見的SGD變體。 它們通過CNTK C#API公開: 

  • SGDLearner - 一個內建CNTK SGD學習器
  • MomentumSGDLearner - 內建CNTK動量SGD學習器
  • FSAdaGradLearner - AdaGrad learner的變體
  • AdamLearner -  Adam learner
  • AdaGradLearner - 自適應梯度學習器
  • RMSPropLearner - RMSProp學習器
  • AdaDeltaLearner - AdaDelta學習器

有關不同學習最佳化器的一般概述,請參閱隨機梯度下降Stochastic gradient descent.

CNTK訓練器用來進行minibatch訓練。以下是minibatch訓練的一段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);    }

這段代碼使用了一個每個樣本學習率為0.02的CNTK內建SGD學習器, 學習器用來為模型參數做最佳化。 訓練器與學習器一同建立,一個是loss函數,一個是評估函數。 在每次訓練迭代期間,將小批量資料送給訓練器以更新模型參數。 訓練期間,訓練耗損和評估誤差由輔助方法顯示。
在代碼中,我們產生了兩類統計分離的標籤和特徵資料。 在其他更實際的例子中,公用測試資料載入了CNTK MinibatchSource。

使用C#/.NET託管API評估深度神經網路

C# API具有評估API來進行模型評估。多數訓練樣本在訓練之後需要進行模型評估。 

開始使用C#訓練樣本

看完這個概述之後,可以通過兩種方法繼續C#培訓樣本:使用GitHub的CNTK源或使用CNTK NuGet for Windows處理CNTK樣本。

通過CNTK源碼
  • 在windows下通過此頁的步驟來建立CNTK
  • 通過VS編譯CNTK.sln
  • 準備樣本資料
  • 在CNTKLibraryCSTrainingTest.csproj中運行樣本作為端到端測試
通過CNTK NuGet擷取CNTK樣本
  • 下載CNTK C#訓練樣本 examples
  • 準備樣本資料.
  • 構建並運行樣本

通過C#/.NET API使用CNTK

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.