利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境


      每个人都习惯使用Python去完成机器学习和深度学习的工作,但是对于习惯于某种特定语言的人来说,转型不是那么容易的事。这两年我花了不少时间在Python,毕竟工作的重心也从移动开发转为机器学习和深度学习。感谢我的老板给我很大的空间去开拓新的领域,但对于不少企业这种转型需要时间,金钱的成本。我一直说,做编码就如打功夫,无论哪个门派都是一个技术栈,你寄望一套拳法可以把所有对手打倒。现阶段最好的跨平台生态已经不再是Java , 你想到的是JavaScript ,还有.NET 。或者不少人会有质疑,但现状就是这样。我今天不谈JavaScript, 重点谈谈.NET Core. 自从微软重新去把.NET 重新规划后,不少的企业或者Startup也开始试水这个既熟悉又陌生的技术环境。如果你执着地坚持着.NET , 你会为现在.NET 那七颗龙珠感到惊喜。从以往桌面/网页,到现在的移动,物联网,云计算,游戏,还有人工智能,更是一个跨平台的解决方案。

640?wx_fmt=jpeg

       在技术领域,一个完整的生态,少不了有不错的开源社区。现在.NET Core的开源社区在不断壮大,在机器学习和深度学习领域除了有官方支持的ML.NET外, 还有Miguel大神的TensorFlowSharp ,更可喜的是有一个基于.NET Core的机器学习和深度学习的技术开源社区SciSharp(https://github.com/SciSharp)。SciSharp 有不少和 Python 机器学习/深度学习的融入的项目,方便.NET Core的程序员无缝融入到机器学习/深度学习的环境中去,更重要一点是你可以继续用你的C#。如果你是一个.NETer,估计也会喜欢上这个开源的项目。毕竟从Jupyter Notebook的支持,到机器学习相关的Numpy.NET / NumpySharp, Pandas.NET , SciSharp , scikit-learn , 到深度学习的Tensorflow.NET , KerasuNET , Torch.NET ,还有自然语言的BotSharp , SpaCy.NET 都做了.NET Core的移植。一个技术生态好与坏,就看你的开源项目质量了。这是一个不错的开端。

640?wx_fmt=png

       传统的机器学习/深度学习的工作方式,和我们写代码不一样,基于Jupyter Notebook ,通过ICSharpCore(https://github.com/SciSharp/ICSharpCore)你可以为Jupyter Notebook 添加C#的支持。如果你是传统程序员,你会喜欢IDE ,但在机器学习/深度学习的环境你更应该在Jupyter Notebook上开发。你可以通过Docker去部署这个环境(https://github.com/SciSharp/SciSharpCube之前社区好友分享过文章),但考虑到更高性能个人推荐还是在本机运行。我来补充下在本机的一些配置方法,你还是得安装Python, 建议还是装3.6.x / 3.7 , 还有别忘记通过pip去安装jupyter(pip3 install jupyter),。毕竟这个解决方案还是得要一个标准的Python做支持。接下来就是一些很.NET Core的事情了

  • 去下载一份ICSharpCore(https://github.com/SciSharp/ICSharpCore)的源码在本地编译,会生成dll,这里得提提如果你希望你的ICSharpCore环境支持ML.NET 你需要在改项目下通过dotnet add package添加ML.NET的支持

  • 去kernel-spec目录下修改kernel.json , 指定好刚才编译生成的ICSharpCore.dll的路径

  • 回到ICSharpCore目录下执行 jupyter kernelspec install kernel-spec --name=csharpcore  通过运行语句jupyter kernelspec list 检查是否成功添加

       我们通过启动jupyter notebook来测试下环境,通过New 可以看到选项已经添加C#的支持(SciSharpCube这个名字不错,所以我省得再修改了,当然你觉得不够爽就自己通过修改kernel.json去修改),选中SciSharpCube就可以在Jupyter Notebook使用C#代码
       

640?wx_fmt=png


       因为ICSharpCore结合Roslyn编译器进行使用,所以你引用库时,也需要通过#r 进行使用,看两个基于ML.NET的notebook,是不是很cool呢?

640?wx_fmt=png

640?wx_fmt=png


       回头谈一些细节,现在SciSharp对于不同框架的绑定,无非两种,第一种像TensorFlow.NET是基于TensorFlow原生的C库做绑定,这种做法的优点是对Python的依赖少,更像原生实现,第二种就直接基于pythonnet(https://github.com/pythonnet/pythonnet)这个扩展去实现,这种做法就是桥接只需要做一些简单的语言扩展就可以快速实现功能,但有一个问题就是对本机Python环境依赖极高需要为不同版本的Python版本设置不同的dll,还有就是不够原汁原味了。但这两种方法其实对环境变量的设置都有要求,如TensorFlow.NET原生 就别忘记去设置TF的C库放置的环境变量路径,还有如依赖于pythonnet的Keras.NET, Numpy.NET就别忘记指定好你本机Python版本的lib文件夹路径,否则就会出现很多问题。我可是花了不少时间的。
        SciSharp在medium上有不少介绍和示例(https://medium.com/scisharp),建议大家都去看看,当然我也会中英文同步发一些原创文章给大家,也建议更多人在社区贡献代码和示例让它成为更优秀的.NET开源项目。

640?wx_fmt=png

原文链接:

https://blog.csdn.net/kinfey/article/details/96095690


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

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

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

相关文章

Acwing 252. 树 点分治

传送门 文章目录题意:思路:题意: 思路: 好久没写淀粉质了,心血来潮复习一下。 淀粉质通常用来统计路径个数,将路径分为子树内的和子树之间的。子树内的递归处理,子树间的存下信息来每次都处理即…

CLR与JVM

首先要纠正垃圾回收在于JVM和.NET的CLR的平台功能而不是语言本身。存在一些历史差异主要是因为.Net的设计是从java(和其他基于gc的平台)演变中吸取教训改良后的结果。CLR一开始就设计成了分代垃圾回收,但是初始JVM没有分代垃圾收集器。第一代…

使用Mutex进行线程处理

Mutex就像一个C#锁(lock),但它可以跨多个进程工作。换句话说,Mutex可以是计算机范围的,也可以是应用程序范围的。Mutex是一个同步原语,也可用于进程间同步。当两个或多个线程需要同时访问共享资源时,系统需…

Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check

传送门 文章目录题意:思路:题意: 思路: 直接算不好算,考虑二分这个中位数midmidmid。 考虑如何checkcheckcheck,这个分情况来就好了: (1)mid>a[i].r(1)mid>a[i].r(1)mid>a[i].r&#…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 (重要)6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

PYPL 7月榜单公布:Java份额出现下降趋势

PYPL(PopularitY of Programming Language,编程语言流行指数) 7 月份的榜单已发布,目前包含四个排行榜,囊括编程语言、IDE、ODE(Online IDE) 以及数据库四大领域。PYPL 是非常流行的参考指标,其榜单数据的排名均是根据榜单对象在 …

Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分

传送门 文章目录题意:思路:题意: 思路: 还以为这个题有什么高深的算法,结果就是个暴力。 由于n∗mn*mn∗m达到了1e101e101e10的级别,所以直接暴力肯定是不行的,考虑有很多空格,我们…

远古魔力 | 在Windows 10和Azure App Service里跑上世纪的ASP

ASP(没有.NET) 即 Active Server Pages (动态服务器页面)是一项由微软公司在1996年推出的技术,能够在IIS中运行动态网站。也许许多90后及千禧一代程序员并没有听说过它,但很多老程序员曾经用ASP编写了诸如D…

P2375 [NOI2014] 动物园 kmp fail指针/倍增

传送门 文章目录题意:思路:题意: 思路: 由kmpkmpkmp中失配数组nenene的含义我们知道,ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...都是iii的相等的前后缀,但是可能有重叠的部分&#xff0c…

DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?

话题缘起01今天在DevOps案例深度研究讨论群里,群友们围绕一种开发模式展开了讨论:DDD(Deadline Driven Development),期限驱动开发,大家似乎更愿意将其翻译成“上吊绳驱动开发”。这种开发模式是说在接到新…

「Sqlserver」数据分析师有理由爱Sqlserver-好用的插件工具推荐

在此系列中,笔者为大家带来一些以数据分析师视角去使用Sqlserver的系列文章,希望笔者走过的路能够给后来者带来一些便利。背景介绍在数据分析师的角色下,使用数据库更多的是为了从数据库中获取数据,和数据库交互的语言是SQL&#…

P4824 [USACO15FEB]Censoring S kmp + 栈

传送门 文章目录题意:思路:题意: 思路: 如果删除之后两个串不拼起来就是个裸kmpkmpkmp了,但是这个题能拼起来,拼起来之后还有可能生成一个新的串,而且起点在当前位置之前。 考虑是否能找到删掉…

使用kubectl管理k8s集群(三十)

前言Foreword在搭建k8s集群之前,我们需要先了解下kubectl的使用,以便在集群部署出现问题时进行检查和处理。命令和语法记不住没有关系,但是请记住主要的语法和命令以及帮助命令的使用。在下一篇,我们将讲述使用Kubeadm来创建k8s集…

P3435 [POI2006]OKR-Periods of Words kmp + fail指针

传送门 文章目录题意:思路:题意: 思路: 转换一下题意,就是求一个最小公共前后缀,显然可以暴跳nenene数组,复杂度O(n2)O(n^2)O(n2),注意到我们每次都跳的话会跳到很多重复的位置&…

架构杂谈《四》

分布式一致性协议一、引言在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些个副本会放在不同的物理机上,为了对用户提供正确的数据,我们需要保证这些放在不同物理机上的副本是一致的。为了…

Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp

传送门 文章目录题意:思路:题意: 思路: 通过完美子串的定义,我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串,现在问题就是如何求这些前缀串在串中出现的次数了。 考虑一个前…

译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)

原文:Cesar De la Torre翻译:Edi Wang我们很高兴地宣布ML.NET 1.2 和模型生成器和 CLI 的更新。ML.NET是 .NET 开发人员的开源和跨平台机器学习框架。ML.NET还包括模型生成器(Visual Studio 的简单 UI 工具)和ML.NET CLI(命令行界面),以便使用自动机器学…

Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

传送门 文章目录题意:思路:题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起。再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了。 定义f[i]f[i]f[i]表示状态为iii的串的长度…

一个超轻量级工作流引擎:Workflow-Core

近期工作上有一个工作流的开发需求,自己基于面向对象和职责链模式捣鼓了一套小框架,后来在github上发现一个轻量级的工作流引擎轮子:Workflow-Core,看完其wiki之后决定放弃之前自己造的轮子,使用这个开源项目来改造&am…

Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接考虑比较难想&#xff0c;这种公式题基本都是将部分答案看成一个整体&#xff0c;考虑xi,xi1x_i,x_{i1}xi​,xi1​的贡献的。 假设当前的xix,xi1y,x<yx_ix,x_{i1}y,x<yxi​x,xi1…