通过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;光是看这酷炫的页面都比较有欲望…

一文理解Netty模型架构

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

尝试涉猎更多领域

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

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

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

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早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙的那叫一个脚不沾地啊. 今天的学习内容? 使用我们前面所学的技术,写一个增删改查. 效果如下…

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…

Ae做一个立体地球

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

ASP.NET Core 处理 404 Not Found

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

搭建一个二次元博客

小叙&#xff1a; 因为前段日子尝试过自己搭建网站&#xff0c;也在b站发了视频&#xff0c;奈何技术太菜&#xff0c;被喷的严重。所以决定重构一下网站&#xff0c;改成一个个人博客。这里非常感谢小游提供的主题&#xff0c;感谢他对这么优秀的主题的推广。 如果你正好也要…

从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD

Github源码地址&#xff1a;https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 这是第一大部分的最后一小部分。要完成CRUD的操作。 Repository Pattern 我们可以直接在Controller访问DbContext&#xff0c;但是可能会有一些问题: …

做这个网站原因之二

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

spring cloud+dotnet core搭建微服务架构:配置中心续(五)

前言 上一章最后讲了&#xff0c;更新配置以后需要重启客户端才能生效&#xff0c;这在实际的场景中是不可取的。由于目前Steeltoe配置的重载只能由客户端发起&#xff0c;没有实现处理程序侦听服务器更改事件&#xff0c;所以还没办法实现彻底实现这一功能。这一章的例子&…

聊聊最近吧

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

AspectCore.Extension.Reflection : .NET Core反射扩展库

在从零实现AOP的过程中&#xff0c;难免会需要大量反射相关的操作&#xff0c;虽然在.net 4.5/.net core中反射的性能有了大幅的优化&#xff0c;但为了追求极致性能&#xff0c;自己实现了部分反射的替代方案&#xff0c;包括构造器调用、方法调用、字段读写&#xff0c;属性读…