日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

通过C#/.NET API使用CNTK

發(fā)布時(shí)間:2023/12/4 C# 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过C#/.NET API使用CNTK 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。