Použití CNTK s rozhraním C#/.NET API
CNTK verze 2.2.0 poskytuje rozhraní API jazyka C# pro sestavování, trénování a vyhodnocování modelů CNTK. Tato část obsahuje přehled rozhraní CNTK C# API. Příklady trénování jazyka C# jsou k dispozici v úložišti GITHub v CNTK.
Vytvoření hluboké neurální sítě pomocí spravovaného rozhraní API jazyka C#/.NET
Rozhraní CNTK C# API poskytuje základní operace v oboru názvů CNTKLib. Operace CNTK přebírá jednu nebo dvě vstupní proměnné s potřebnými parametry a vytvoří funkci CNTK. Funkce CNTK mapuje vstupní data na výstup. Funkci CNTK lze také považovat za proměnnou a vzít ji jako vstup do jiné operace CNTK. S tímto mechanismem lze vytvořit hlubokou neurální síť se základními operacemi CNTK řetězením a složením. Příklad:
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 jsou základní operace CNTK. Vstupním argumentem může být proměnná CNTK představující datové funkce. Může to být také jiná funkce CNTK. Tento kód vytvoří jednoduchou výpočetní síť s parametry, které jsou upraveny ve fázi trénování, aby byl slušný klasifikátor více tříd.
Rozhraní CNTK C# API poskytuje operace pro vytváření konvolučních neurálních sítí (CNN) a opakujících se neurálních sítí (RNN). Pokud například chcete vytvořit klasifikátor image CNN se dvěma vrstvami:
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");
K dispozici je také příklad sestavení sítě RNN s dlouhodobou pamětí (LTSM).
Příprava dat pomocí jazyka C#/.NET
CNTK poskytuje nástroje pro přípravu dat pro trénování. Rozhraní CNTK C# API zveřejňuje tyto nástroje. Přebírá data z různých předzpracovaných formulářů. Načítání a dávkování dat se provádí efektivně. Předpokládejme například, že máme data v textu v následujícím textovém formátu CNTK s názvem 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
Zdroj dat CNTK se vytvoří tímto způsobem:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
Dávková data se dají načíst a použít k pozdějšímu trénování:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
Trénováním hluboké neurální sítě pomocí spravovaného rozhraní API jazyka C#/.NET
Stochastický gradientní sestup (SGD) je způsob, jak optimalizovat parametry modelu pomocí trénovacích dat minibatchu. CNTK podporuje mnoho variant SGD, které se běžně zobrazují v literaturě hlubokého učení. Jsou vystaveny rozhraním CNTK C# API:
- SGDLearner – integrovaný learner SGD CNTK
- MomentumSGDLearner – integrovaný learner SGD SGD v CNTK
- FSAdaGradLearner – varianta learneru AdaGrad
- AdamLearner – výuka Adama
- AdaGradLearner – adaptivní přechodový učení
- RMSPropLearner – výuka RMSProp
- AdaDeltaLearner – a adaDelta learner
Obecný přehled různých optimalizátorů učení najdete v tématu Stochastic gradientní sestup.
Trenér CNTK se používá k trénování minibatch. Výřez kódu jazyka C# pro trénování minibatch:
// 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);
}
V tomto výsuvku kódu se používá integrovaný studijní program CNTK s každou ukázkovou rychlostí učení = 0,02. Učením je optimalizovat všechny parametry modelu. Trenér je vytvořen s žákem, funkcí ztráty a vyhodnocovací funkcí. Během každé trénovací iterace se minibatch data pro trenéra dosadí, aby se aktualizovaly parametry modelu. Během trénování se zobrazí chyba trénování a vyhodnocení pomocí pomocné metody.
V kódu vygenerujeme dvě třídy statisticky oddělitelných dat popisků a funkcí. V jiných realističtějších příkladech jsou veřejná testovací data načtena pomocí CNTK MinibatchSource.
Vyhodnocení hluboké neurální sítě pomocí spravovaného rozhraní API jazyka C#/.NET
Rozhraní API jazyka C# má k vyhodnocení modelu rozhraní API. Většina příkladů trénování jazyka C# po trénování provede vyhodnocení modelu.
Další podrobnosti o vyhodnocení modelu pomocí rozhraní CNTK C# API najdete na adrese .
- Vyhodnocení knihovny CNTK ve Windows
- Vyhodnocení v Azure
- Vyhodnocení Univerzální platforma Windows (UPW)
- Balíčky NuGet
Začínáme s příklady trénování jazyka C#
Až tento přehled projdete, můžete pokračovat v příkladech trénování jazyka C# dvěma způsoby: pracovat se zdrojem CNTK z GitHubu nebo pracovat s příklady CNTK pomocí NuGetu CNTK pro Windows.
práce se zdrojem CNTK
- Postupujte podle kroků na této stránce a nastavte CNTK ve windows.
- Sestavte CNTK.sln pomocí sady Visual Studio.
- Příprava ukázkových dat
- Spuštění příkladů jako kompletních testů v CNTKLibraryCSTrainingTest.csproj
práce s příklady CNTK s nuGetem CNTK
- Stažení příkladů trénování CNTK C#
- Příprava ukázkových dat
- Sestavte a spusťte příklady.