你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将 CNTK 与 C#/.NET API 配合使用
CNTK v2.2.0 提供 C# API 来生成、训练和评估 CNTK 模型。 本部分概述了 CNTK C# API。 CNTK github 存储库中提供了 C# 训练示例。
使用 C#/.NET 托管 API 生成深度神经网络
CNTK C# API 在 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 函数。 此代码生成一个简单的计算网络,其中包含在训练阶段调整的参数,使一个体面的多类分类器。
CNTK C# API 提供用于生成卷积神经网络的操作, (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");
还提供了一个使用长期内存 (LTSM) 生成 RNN 的示例。
使用 C#/.NET 进行数据准备
CNTK 提供用于训练的数据准备实用工具。 CNTK C# API 公开这些实用工具。 它从各种预处理表单获取数据。 数据加载和批处理可以高效完成。 例如,假设以下 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 DataSource 以这种方式创建:
var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
Path.Combine(DataFolder, "Train.ctf"), streamConfigurations,
MinibatchSource.InfinitelyRepeat, true);
可以在以后检索和用于训练的批处理数据:
var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
使用 C#/.NET 托管 API 训练深度神经网络
随机渐变下降 () 是一种使用微型batch 训练数据优化模型参数的方法。 CNTK 支持许多在深度学习文献中常见的 SDK 变体。 它们由 CNTK C# API 公开:
- SGDLearner - CNTK 内置 SDK 学习器
- MomentumSGDLearner - CNTK 内置 Momentum SGD 学习器
- FSAdaGradLearner - AdaGrad 学习器变体
- AdamLearner - 亚当学习者
- AdaGradLearner - 自适应渐变学习器
- RMSPropLearner - RMSProp 学习器
- AdaDeltaLearner - AdaDelta 学习器
有关不同学习优化器的一般概述,请参阅 随机梯度下降。
CNTK 训练器用于进行迷你袋训练。 用于微型batch 训练的 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);
}
在此代码狙击中,使用按采样学习速率为 0.02 的 CNTK 内置 SDK 学习器。 学习器是优化模型的所有参数。 使用学习器、损失函数和评估函数创建训练器。 在每次训练迭代迷你分量数据中,都会向训练器馈送模型参数更新。 训练期间,训练丢失和评估错误会显示在帮助程序方法中。
在代码中,我们生成两类标签和特征的可统计分离数据。 在其他更现实 的示例中,公共测试数据使用 CNTK MinibatchSource 加载。
使用 C#/.NET 托管 API 评估深度神经网络
C# API 具有评估 API 来执行模型评估。 大多数 C# 训练示例在训练 后执行模型评估。
有关使用 CNTK C# API 的更多模型评估详细信息,请参阅
C# 培训示例入门
完成此概述后,可以通过两种方式继续学习 C# 培训示例:使用 GitHub 中的 CNTK 源,或使用 CNTK NuGet for Windows 使用 CNTK 示例。
使用 CNTK 源
- 按照 此页面中的 步骤在 Windows 上设置 CNTK。
- 使用 Visual Studio 生成 CNTK.sln。
- 准备示例数据。
- 在 CNTKLibraryCSTrainingTest.csproj 中以端到端测试的形式运行示例