CNTK gebruiken met C#/.NET API
CNTK v2.2.0 biedt C#-API voor het bouwen, trainen en evalueren van CNTK-modellen. In deze sectie vindt u een overzicht van de CNTK C#-API. C#-trainingsvoorbeelden zijn beschikbaar in cntk github-opslagplaats.
Beheerde API van C#/.NET gebruiken om een deep neural network te bouwen
CNTK C#-API biedt basisbewerkingen in CNTKLib-naamruimte. Een CNTK-bewerking gebruikt een of twee invoervariabelen met de benodigde parameters en produceert een CNTK-functie. Een CNTK-functie wijst invoergegevens toe aan uitvoer. Een CNTK-functie kan ook worden behandeld als een variabele en worden beschouwd als invoer voor een andere CNTK-bewerking. Met dit mechanisme kan een diep neuraal netwerk worden gebouwd met eenvoudige CNTK-bewerkingen door keten en samenstelling. Bijvoorbeeld:
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 zijn eenvoudige CNTK-bewerkingen. Het invoerargument kan een CNTK-variabele zijn die gegevensfuncties vertegenwoordigt. Het kan ook een andere CNTK-functie zijn. Met deze code wordt een eenvoudig rekennetwerk gebouwd met parameters die in de trainingsfase worden aangepast om een fatsoenlijke classificatie met meerdere classificaties te maken.
CNTK C#-API biedt bewerkingen voor het bouwen van convolutionele neurale netwerken (CNN's) en terugkerende neurale netwerken (RNN's). Als u bijvoorbeeld een CNN-afbeeldingsclassificatie met twee lagen wilt maken:
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");
Er wordt ook een voorbeeld gegeven om een RNN te bouwen met LTSM (long-short-term-memory).
Gegevensvoorbereiding met C#/.NET
CNTK biedt hulpprogramma's voor gegevensvoorbereiding voor training. De CNTK C#-API maakt deze hulpprogramma's beschikbaar. Er worden gegevens uit verschillende voorverwerkte formulieren gebruikt. Gegevens laden en batchverwerking worden efficiënt uitgevoerd. Stel dat we gegevens in tekst hebben in de volgende CNTK-tekstindeling met de naam 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
Op deze manier wordt een CNTK-gegevensbron gemaakt:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
Batchgegevens kunnen later worden opgehaald en gebruikt voor training:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
Beheerde API van C#/.NET gebruiken om een deep neural network te trainen
Stochastische gradiëntafname (SGD) is een manier om modelparameters te optimaliseren met minibatchtrainingsgegevens. CNTK ondersteunt veel SGD-variaties die vaak worden gezien in deep learning-literatuur. Ze worden weergegeven door DE CNTK C#-API:
- SGDLearner - een ingebouwde CNTK-cursist voor SGD
- MomentumSGDLearner - een CNTK ingebouwde Momentum SGD-cursist
- FSAdaGradLearner - een variatie van AdaGrad-cursist
- AdamLearner - een Adam-cursist
- AdaGradLearner - een adaptieve kleurovergangsleerder
- RMSPropLearner - een RMSProp-cursist
- AdaDeltaLearner - een AdaDelta-cursist
Zie Stochastische gradiëntafname voor een algemeen overzicht van verschillende leeroptimalisaties.
Een CNTK trainer wordt gebruikt om minibatch training uit te voeren. Een C#-codefragment voor minibatchtraining:
// 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);
}
In dit codefragment wordt een ingebouwde CNTK-cursist met een steekproefleersnelheid = 0,02 gebruikt. De cursist is het optimaliseren van alle parameters van het model. Een trainer wordt gemaakt met de cursist, een verliesfunctie en een evaluatiefunctie. Tijdens elke trainingsiteratie worden minibatchgegevens aan de trainer ingevoerd om modelparameters te laten bijwerken. Trainig-verlies- en evaluatiefout worden weergegeven met een helpermethode tijdens de training.
In de code genereren we twee klassen van statistisch gescheiden gegevens van labels en functies. In andere realistischere voorbeelden worden openbare testgegevens geladen met CNTK MinibatchSource.
Beheerde API van C#/.NET gebruiken om een deep neural network te evalueren
De C#-API heeft een evaluatie-API om modelevaluatie uit te voeren. De meeste C#-trainingsvoorbeelden voeren modelevaluatie uit na de training.
Meer details over modelevaluatie met CNTK C# API vindt u op
- Evaluatie van CNTK-bibliotheek in Windows
- Evaluatie in Azure
- Evaluatie van Universeel Windows-platform (UWP)
- NuGet-Pakketten
Aan de slag met C#-trainingsvoorbeelden
Zodra u dit overzicht hebt doorlopen, kunt u op twee manieren doorgaan met C#-trainingsvoorbeelden: werken met CNTK-bron vanuit GitHub of met CNTK-voorbeelden werken met CNTK NuGet voor Windows.
werken met CNTK-bron
- Volg de stappen op deze pagina om CNTK in windows in te stellen.
- Bouw CNTK.sln met Visual Studio.
- Voorbeeldgegevens voorbereiden.
- Voorbeelden uitvoeren als end-to-end-tests in CNTKLibraryCSTrainingTest.csproj
werken met CNTK-voorbeelden met CNTK NuGet
- CNTK C#-trainingsvoorbeelden downloaden
- Voorbeeldgegevens voorbereiden.
- Bouw en voer de voorbeelden uit.