Использование CNTK с API C#/.NET
CNTK версии 2.2.0 предоставляет API C# для создания, обучения и оценки моделей CNTK. В этом разделе представлен обзор API C# CNTK. Примеры обучения C# доступны в репозитории GitHub CNTK.
Использование управляемого API C#/.NET для создания глубокой нейронной сети
API C# предоставляет основные операции в пространстве имен 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. Этот код создает простую вычислительную сеть с параметрами, настроенными на этапе обучения, чтобы сделать достойный многоклассовый классификатор.
API CNTK C# предоставляет операции для создания сверток нейронных сетей (CNN) и повторяющихся нейронных сетей (RNN). Например, чтобы создать двухуровневый классификатор изображений 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");
Также приведен пример создания RNN с долгосрочной краткосрочной памятью (LTSM).
Подготовка данных с помощью C#/.NET
CNTK предоставляет служебные программы подготовки данных для обучения. API C# C# C# предоставляет эти служебные программы. Он принимает данные из различных предварительно обработанных форм. Загрузка и пакетная обработка данных выполняются эффективно. Например, предположим, что у нас есть данные в тексте в следующем текстовом формате CNTK под названием 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
Источник данных CNTK создается таким образом:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
Пакетные данные можно получить и использовать для обучения позже:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
Использование управляемого API C#/.NET для обучения глубокой нейронной сети
Стохастический градиентный спуск (JSON) — это способ оптимизации параметров модели с помощью обучающих данных мини-бэтч. CNTK поддерживает множество вариантов JSON, которые часто встречаются в литературе глубокого обучения. Они предоставляются API C# CNTK:
- EURLearner — встроенный учащийся CNTK
- MomentumSGDLearner — встроенный обучающий объект Momentum NTK
- FSAdaGradLearner — разновидность ученика AdaGrad
- АдамLearner - Ученик Адама
- AdaGradLearner — обучающийся с адаптивным градиентом
- RMSPropLearner — учащийся RMSProp
- AdaDeltaLearner — ученик AdaDelta
Общие сведения о различных оптимизаторах обучения см. в статье Стохастический градиентный спуск.
Тренер CNTK используется для обучения мини-бэтч. Фрагмент кода C# для обучения мини-бэтч:
// 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);
}
В этом фрагменте кода используется встроенный обучающий метод CNTK СО скоростью обучения для каждой выборки = 0,02. Учащийся предназначен для оптимизации всех параметров модели. Обучающий объект создается с помощью обучающего объекта, функции потери и функции оценки. Во время каждого обучающего итерации данные мини-пакетов передаются тренеру для обновления параметров модели. Ошибка потери и оценки trainig отображается с помощью вспомогательного метода во время обучения.
В коде создаются два класса статистически отделяемых данных меток и признаков. В других более реалистичных примерах общедоступные тестовые данные загружаются с помощью CNTK MinibatchSource.
Использование управляемого API C#/.NET для оценки глубокой нейронной сети
API C# имеет API оценки для оценки модели. Большинство примеров обучения C# выполняют оценку модели после обучения.
Дополнительные сведения об оценке модели с помощью API CNTK C# можно найти по адресу
- Оценка библиотеки CNTK в Windows
- Оценка в Azure
- Оценка универсальная платформа Windows (UWP)
- Пакеты NuGet
Начало работы с примерами обучения на C#
После прохождения этого обзора вы можете перейти к примерам обучения на C# двумя способами: работать с источником CNTK из GitHub или работать с примерами CNTK с помощью CNTK NuGet для Windows.
работа с источником CNTK
- Выполните действия, описанные на этой странице , чтобы настроить CNTK в окнах.
- Выполните сборку CNTK.sln с помощью Visual Studio.
- Подготовьте образцы данных.
- Выполнение примеров в виде комплексных тестов в CNTKLibraryCSTrainingTest.csproj
работа с примерами CNTK с помощью NuGet CNTK
- Скачивание примеров обучения CNTK на C#
- Подготовьте образцы данных.
- Выполните сборку и запуск примеров.