Używanie zestawu CNTK z interfejsem API języka C#/.NET
CnTK v2.2.0 udostępnia interfejs API języka C# do tworzenia, trenowania i oceniania modeli CNTK. Ta sekcja zawiera omówienie interfejsu API C# CNTK. Przykłady szkoleń w języku C# są dostępne w repozytorium github CNTK.
Tworzenie głębokiej sieci neuronowej przy użyciu interfejsu API zarządzanego języka C#/.NET
Interfejs API języka C# CNTK zapewnia podstawowe operacje w przestrzeni nazw CNTKLib. Operacja CNTK przyjmuje jedną lub dwie zmienne wejściowe z niezbędnymi parametrami i tworzy funkcję CNTK. Funkcja CNTK mapuje dane wejściowe na dane wyjściowe. Funkcja CNTK może być również traktowana jako zmienna i być traktowana jako dane wejściowe do innej operacji CNTK. Dzięki temu mechanizmowi można utworzyć głęboką sieć neuronową z podstawowymi operacjami CNTK, tworząc łańcuchy i skład. Przykład:
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 to podstawowe operacje CNTK. Argumentem wejściowym może być zmienna CNTK reprezentująca funkcje danych. Może to być również inna funkcja CNTK. Ten kod tworzy prostą sieć obliczeniową z parametrami, które są dostosowywane na etapie trenowania, aby utworzyć przyzwoity klasyfikator wieloklasowy.
Interfejs API C# cnTK udostępnia operacje tworzenia konwolucyjnych sieci neuronowych (CNN) i cyklicznych sieci neuronowych (RN). Na przykład aby utworzyć dwuwarstwowy klasyfikator obrazu 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");
Podano również przykład tworzenia sieci RNN z pamięcią długoterminową (LTSM).
Przygotowywanie danych przy użyciu języka C#/.NET
CNTK udostępnia narzędzia do przygotowywania danych do trenowania. Interfejs API języka C# CNTK uwidacznia te narzędzia. Pobiera dane z różnych wstępnie przetworzonych formularzy. Ładowanie i przetwarzanie wsadowe danych odbywa się wydajnie. Załóżmy na przykład, że mamy dane w tekście w następującym formacie tekstowym CNTK o nazwie "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
Źródło danych CNTK jest tworzone w następujący sposób:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
Dane wsadowe można pobrać i użyć do późniejszego trenowania:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
Trenowanie głębokiej sieci neuronowej przy użyciu interfejsu API zarządzanego języka C#/.NET
Stochastyczny spadek gradientu (SGD) to sposób optymalizacji parametrów modelu przy użyciu danych treningowych minibatch. CNTK obsługuje wiele odmian SGD, które są często spotykane w literaturze uczenia głębokiego. Są one udostępniane przez interfejs API C# CNTK:
- SGDLearner - wbudowany uczeń SGD CNTK
- MomentumSGDLearner — wbudowany moduł Momentum SGD
- FSAdaGradLearner — odmiana ucznia AdaGrad
- AdamLearner - uczeń Adama
- AdaGradLearner — adaptacyjny uczeń gradientu
- RMSPropLearner — uczni RMSProp
- AdaDeltaLearner — uczeń AdaDelta
Aby zapoznać się z ogólnym omówieniem różnych optymalizatorów uczenia, zobacz Stochastic gradient spadek.
Trener CNTK służy do szkolenia minibatch. Fragment kodu języka C# na potrzeby szkolenia 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);
}
W tym fragmencie kodu jest używany wbudowany uczeń SGD CNTK z częstotliwością nauki próbki = 0,02. Osoba ucząca się polega na optymalizacji wszystkich parametrów modelu. Trener jest tworzony z uczniem, funkcją straty i funkcją ewaluacyjną. Podczas każdej iteracji treningowej dane minibatch są przekazywane do trenera w celu zaktualizowania parametrów modelu. Podczas trenowania są wyświetlane błędy utraty i oceny z metodą pomocnika.
W kodzie generujemy dwie klasy statystycznie rozdzielanych danych etykiet i funkcji. W innych bardziej realistycznych przykładach publiczne dane testowe są ładowane z CNTK MinibatchSource.
Używanie zarządzanego interfejsu API C#/.NET do oceny głębokiej sieci neuronowej
Interfejs API języka C# ma interfejs API oceny do oceny modelu. Większość przykładów trenowania w języku C# wykonuje ocenę modelu po trenowaniu.
Więcej szczegółów oceny modelu przy użyciu interfejsu API C# CNTK można znaleźć na stronie
- Ocena biblioteki CNTK w systemie Windows
- Ocena na platformie Azure
- Ocena platforma uniwersalna systemu Windows (UWP)
- Pakiety NuGet
Wprowadzenie do przykładów szkoleń w języku C#
Po przejrzeniu tego przeglądu możesz przejść do przykładów szkoleniowych języka C# na dwa sposoby: aby pracować ze źródłem CNTK z usługi GitHub lub pracować z przykładami CNTK przy użyciu narzędzia NUGet CNTK dla systemu Windows.
praca ze źródłem CNTK
- Wykonaj kroki opisane na tej stronie , aby skonfigurować zestaw CNTK w oknach.
- Skompiluj plik CNTK.sln za pomocą programu Visual Studio.
- Przygotowywanie przykładowych danych.
- Uruchamianie przykładów jako testów end-to-end w pliku CNTKLibraryCSTrainingTest.csproj
praca z przykładami CNTK za pomocą narzędzia NUGet CNTK
- Pobierz przykłady szkoleń CNTK C#
- Przygotowywanie przykładowych danych.
- Skompiluj i uruchom przykłady.