通过C#/.NET API使用CNTK

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, 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函数。 该代码构建了一个简单的计算网络,其参数在训练阶段进行调整,以创建一个像样的多类分类器(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, -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");


还提供了构建具有长短时内存(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公开: 

  • SGDLearner - 一个内置CNTK SGD学习器

  • MomentumSGDLearner - 内置CNTK动量SGD学习器

  • FSAdaGradLearner - AdaGrad learner的变体

  • AdamLearner -  Adam learner

  • AdaGradLearner - 自适应梯度学习器

  • RMSPropLearner - RMSProp学习器

  • AdaDeltaLearner - AdaDelta学习器

有关不同学习优化器的一般概述,请参阅随机梯度下降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, 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内置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示例

  • 下载CNTK C#训练示例 examples

  • 准备示例数据.

  • 构建并运行示例

原文地址:http://www.cnblogs.com/lori/p/7659923.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka Controller Redesign 方案

转载自 Kafka Controller Redesign 方案 Kafka Controller 是 Kafka 的核心组件&#xff0c;在前面的文章中&#xff0c;已经详细讲述过 Controller 部分的内容。在过去的几年根据大家在生产环境中应用的反馈&#xff0c;Controller 也积累了一些比较大的问题&#xff0c;而针…

做个人网站的原因

昨天b站上看视频&#xff0c;浏览评论时&#xff0c;看到一个网址 https://xiaoyou66.com/ 博主写了大概一百篇的文章&#xff0c;我进来的时候真的是被这js特效给惊到了&#xff0c;个人网站也能变得这么二次元嘛&#xff0c;讲实话&#xff0c;光是看这酷炫的页面都比较有欲望…

nssl1257-A【数论】

正题 题目大意 对于n个数组成的序列&#xff0c;求排好序需要最少交换次数的期望次数。 解题思路 我们可以先求出需要次数总和在乘上n!n!n!的逆元 先打一个表&#xff0c;不难发现 f(n)f(n−1)∗n(n−1)(n−1)!f(n)f(n-1)*n(n-1)(n-1)!f(n)f(n−1)∗n(n−1)(n−1)! 然后我们在…

一文理解Netty模型架构

转载自 一文理解Netty模型架构 本文基于Netty4.1展开介绍相关理论模型&#xff0c;使用场景&#xff0c;基本组件、整体架构&#xff0c;知其然且知其所以然&#xff0c;希望给读者提供学习实践参考。 1 Netty简介 Netty是 一个异步事件驱动的网络应用程序框架&#xff0c;用…

尝试涉猎更多领域

昨天b站上看视频&#xff0c;浏览评论时&#xff0c;看到一个网址 https://xiaoyou66.com/ 博主写了大概一百篇的文章&#xff0c;我进来的时候真的是被这js特效给惊到了&#xff0c;个人网站也能变得这么二次元嘛&#xff0c;讲实话&#xff0c;光是看这酷炫的页面都比较有欲望…

nssl1258-naive的瓶子【贪心】

正题 题目大意 有n个瓶子&#xff0c;将一个瓶子变成相邻一个瓶子的颜色价值为它们颜色值的乘积&#xff0c;求将所有瓶子变成同一个颜色的最低价值。 解题思路 枚举最后的剩下的颜色&#xff0c;然后对于每个瓶子只有两种可能 1.直接变成那个颜色 2.变成别的颜色在变成那个颜…

聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了&#xff0c;一方面是因为公司事情最近比较忙&#xff0c;另外一方面是因为在进行 CAP 的下一阶段的开发工作&#xff0c;不过目前已经告一段落了。 接下来还是开始我们今天的话题&#xff0c;说说分布式事务&#xff0c;或者说是我眼中的分布式事务&…

已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和集合B的差集(近由在A中出现而不再B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。

#include <iostream> using namespace std; //第四题 typedef struct Lnode {int data;struct Lnode *next;} lnode, *linklist; void creatlist_h(linklist &L, int n) {lnode *p;Lnew lnode;L->nextNULL;for(int i0; i<n; i){pnew lnode;cin>>p->da…

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

转载自 RedisTomcatNginx集群实现Session共享&#xff0c;Tomcat Session共享 一、Session共享使用tomcat-cluster-redis-session-manager插件实现 插件地址见&#xff1a; https://github.com/ran-jit/tomcat-cluster-redis-session-manager 该插件支持Tomcat7、Tomcat8、To…

个人博客搭建

先下载node.js 用npm或cnpm安装hexo cnpm install hexo 再创建一个文件夹&#xff0c;在文件夹目录下打开cmd 输入 hexo init 输入 hexo s 这就在本地算是完成了一个博客的创建 新建博客hexo n ‘Hello world’ hexo clean hexo s 就可以再次启动&#xff0c;这样 记得先 cn…

C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙的那叫一个脚不沾地啊. 今天的学习内容? 使用我们前面所学的技术,写一个增删改查. 效果如下…

nssl1259-sequence【组合数,差分】

正题 题目大意 操作(l,r,k)(l,r,k)(l,r,k)表示 l∼rl\sim rl∼r这段区间&#xff0c;对于每个iii&#xff0c;加上Ckik−lC_k^{ik-l}Ckik−l​ 解题思路 我们可以发现对于一个全是1的序列&#xff0c;求kkk次前缀和&#xff0c;就是杨辉三角的第k1k1k1列&#xff0c;那么对于…

hexo部署在码云出现样式问题

然而本地服务器并没有任何问题 重建一个 重新建一个仓库 还是这种情况&#xff0c;回头再找原因&#xff0c;两次都是这种情况&#xff0c;就是配置错了 借用 https://blog.csdn.net/xiangwanpeng/article/details/53155642 https://blog.csdn.net/qq_29347295/article/deta…

当你输入一个网址的时候,实际会发生什么?

转载自 当你输入一个网址的时候&#xff0c;实际会发生什么? 译文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者&#xff0c;你一定会对网络应用如何工作有一个完整的层次化的认知&#xff0c;同样这里也包括这些应用所…

SIMD via C#

简介 TL;DR 我们为C#&#xff08;准确地说是.NET Core&#xff09;引入了一套全新的机制&#xff0c;使得C# 以后可以像C/C 一样直接使用intrinsic functions 来直接操作Intel CPU 的大多数SIMD 指令了&#xff08;从SSE 到AVX2&#xff09;。 &#xff08;注意是以后&#xff…

ssl提高组周三备考赛【2018.10.31】

前言 呆学校呆3天依旧不想复习期中&#xff0c;感觉要凉。 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself1801801801001001008080800002222014yqf2014yqf2014yqf1401401400004040401001001004442017lw2017lw2017lw808080000…

Ae做一个立体地球

Ae做一个立体地球 拿到一张照片 将它变成标题的地球 在AE里 即可变成一个地球 看上去亮多了&#xff0c;再定个关键帧即可旋转

ASP.NET Core 处理 404 Not Found

问题 在没有修改任何配置的情况下&#xff0c;这是用户使用 Chrome 访问不存在的URL时会看到的内容&#xff1a; 幸运的是&#xff0c;处理错误状态代码非常简单&#xff0c;我们将在下面介绍三种技术。 解决方案 在以前的ASP.NET MVC版本中&#xff0c;主要在 web.config 中处…

搞定所有的跨域请求问题

转载自 搞定所有的跨域请求问题 网上各种跨域教程&#xff0c;各种实践&#xff0c;各种问答&#xff0c;除了简单的 jsonp 以外&#xff0c;很多说 CORS 的都是行不通的&#xff0c;老是缺那么一两个关键的配置。本文只想解决问题&#xff0c;所有的代码经过亲自实践。 本文…

nssl1269-射击【贪心,堆】

正题 题目大意 有n个东西&#xff0c;东西必须在aisa_i\ sai​ s前破坏&#xff0c;破坏后可以获得wiw_iwi​价值&#xff0c;求最大价值。 解题思路 我们可以将时间从大到小排序&#xff0c;然后用堆&#xff0c;每次处理价值最大的就好了。 code #include<cstdio> #…