原文)CNTK v2.2.0提供C#API来建立、训练和评估CNTK模型。 本节概要介绍了CNTK C#API。 在CNTK github respository中可以找到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, }
Parameter weights = new Parameter(new int[]{input.Shape[], numOutputClasses}, DataType.Float,
CNTKLib.GlorotUniformInitializer(
CNTKLib.DefaultParamInitScale,
CNTKLib.SentinelValueForInferParamInitRank,
CNTKLib.SentinelValueForInferParamInitRank, ));
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函数。 该代码构建了一个简单的计算网络,其参数在训练阶段进行调整,以创建一个像样的多类分类器(multi-class classifier)。

CNTK C#API提供了构建卷积神经网络(CNN)和复发神经网络(RNN)的选项。 例如,构建一个2层CNN图像分类器:

var convParams1 = new Parameter(
new int[] { kernelWidth1, kernelHeight1, numInputChannels, outFeatureMapCount1 },
DataType.Float, CNTKLib.GlorotUniformInitializer(convWScale, -, ), device);
var convFunction1 = CNTKLib.ReLU(CNTKLib.Convolution(
convParams1, input,
new int[] { , , 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, -, ), device);
var convFunction2 = CNTKLib.ReLU(CNTKLib.Convolution(
convParams2, pooling1,
new int[] { , , 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");

还提供了构建具有长短时内存(LSTM)的RNN的示例。

通过C#/.NET准备数据

CNTK提供用于训练的数据准备工具。 CNTK C#API公开了这些工具。 它可以接受各种预处理形式的数据。 数据的加载和批处理数据非常高效。 例如,假定我们有以下称为“Train.ctf”的CNTK文本格式的数据:

|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);

使用C#/ .NET托管API训练深层神经网络

随机梯度下降(SGD)是利用小型训练数据优化模型参数的一种方法。 CNTK支持许多在深入学习文献中常见的SGD变体。 它们通过CNTK C#API公开: 

有关不同学习优化器的一般概述,请参阅随机梯度下降Stochastic gradient descent.

CNTK训练器用来进行minibatch训练。以下是minibatch训练的一段C#diamante片段:

// 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, );
var parameterLearners =
new List<Learner>() { Learner.SGDLearner(classifierOutput.Parameters(), learningRatePerSample) };
var trainer = Trainer.CreateTrainer(classifierOutput, loss, evalError, parameterLearners); int minibatchSize = ;
int numMinibatchesToTrain = ; // train the model
for (int minibatchCount = ; 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, );
}

这段代码使用了一个每个样本学习率为0.02的CNTK内置SGD学习器, 学习器用来为模型参数做优化。 训练器与学习器一同创建,一个是loss函数,一个是评估函数。 在每次训练迭代期间,将小批量数据送给训练器以更新模型参数。 训练期间,训练耗损和评估误差由辅助方法显示。
在代码中,我们生成了两类统计分离的标签和特征数据。 在其他更实际的例子中,公共测试数据加载了CNTK MinibatchSource。

使用C#/.NET托管API评估深度神经网络

C# API具有评估API来进行模型评估。多数训练示例在训练之后需要进行模型评估。

开始使用C#训练示例

看完这个概述之后,可以通过两种方法继续C#培训示例:使用GitHub的CNTK源或使用CNTK NuGet for Windows处理CNTK示例。

通过CNTK源码

  • 在windows下通过此页的步骤来建立CNTK
  • 通过VS编译CNTK.sln
  • 准备示例数据
  • 在CNTKLibraryCSTrainingTest.csproj中运行示例作为端到端测试

通过CNTK NuGet获取CNTK示例

通过C#/.NET API使用CNTK的更多相关文章

  1. Keras官方中文文档:序贯模型API

    Sequential模型接口 如果刚开始学习Sequential模型,请首先移步这里阅读文档,本节内容是Sequential的API和参数介绍. 常用Sequential属性 model.layers ...

  2. 深度学习框架caffe/CNTK/Tensorflow/Theano/Torch的对比

    在单GPU下,所有这些工具集都调用cuDNN,因此只要外层的计算或者内存分配差异不大其性能表现都差不多. Caffe: 1)主流工业级深度学习工具,具有出色的卷积神经网络实现.在计算机视觉领域Caff ...

  3. 【翻译】Keras.NET简介 - 高级神经网络API in C#

    Keras.NET是一个高级神经网络API,它使用C#编写,并带有Python绑定,可以在Tensorflow.CNTK或Theano上运行.其关注点是实现快速实验.因为做好研究的关键是:能在尽可能短 ...

  4. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  5. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  6. 几个有趣的WEB设备API(二)

    浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...

  7. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  8. JavaScript 对数据处理的5个API

    JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...

  9. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

随机推荐

  1. day 50 Java Script 学习

    前端基础之JavaScript   JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...

  2. sofa graphql 2 rest api webhook 试用

    sofa 的webhook实际上就是将graphql 的subscription 进行了扩展,当接受到sub 请求的时候 再做一次http 的转发处理,方便rest api 的访问 环境准备 环境还是 ...

  3. PowerDesigner V16.5 安装及汉化

    一.power designer是什么以及是干什么的? power designer是能进行数据库设计的强大的软件,是一款开发人员常用的数据库建模工具.分别从概念数据模型(Conceptual Dat ...

  4. Python---Pycharm如何直接上传自己的代码到GitHub

    请提前到官网注册GitHub账号,提前在terminal或者cmd安装git,然后你要检测自己电脑是否存在 SSH key,然后需要把SSH key复制下来,粘贴到你的GitHub. - 第一步:安装 ...

  5. MySQL中视图

    视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用 ...

  6. C++用 _findfirst 和 _findnext 查找文件

    一.这两个函数均在io.h里面.   二.首先了解一下一个文件结构体: struct _finddata_t {     unsigned    attrib;     time_t      tim ...

  7. WEKA结果解读

    红括号里面,左边是bad的数目,右边是good数目. TP Rate   FP Rate   Precision   Recall  F-Measure  ROC Area  Class 0.536 ...

  8. java rsa 公钥加密

    注意JAVA 的STRING .getBytes() 默认取的是操作系统的编码,最好统一UTF-8. -- /* * To change this license header, choose Lic ...

  9. SVN怎么触发Jenkins自动构建

    通常,有几种方式可以在SVN仓库发生改变时触发Jenkins进行构建.第一种是,Jenkins主动轮询SVN仓库:第二种是,在SVN客户端(如TortoiseSVN)创建客户端hooks来触发构建:第 ...

  10. 安装Python时遇到的api-ms-win-crt-runtime-l1-1-0.dll 丢失问题

    api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示“api- ...