利用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,一经查实,立即删除!

相关文章

【牛客NOIP模拟】牛半仙的妹子序列【DP】【Segment Tree Beats】

题意&#xff1a;排列的极长上升子序列个数 n≤2105n\leq 2\times 10^5n≤2105 显然有个 dp fn∑i<n,pi<pn,∄i<j<ns.t. pi<pj<pnfif_n\sum_{i<n,p_i<p_n,\nexists i<j<n\text{ s.t. }p_i<p_j<p_n}f_ifn​i<n,pi​<pn​,∄i<j&l…

Acwing 252. 树 点分治

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

CLR与JVM

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

【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

题意&#xff1a; nmn\times mnm 的网格图&#xff0c;每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​&#xff0c;从 (1,1)(1,1)(1,1) 开始只能向下或向右走到 (n,m)(n,m)(n,m) &#xff0c;在某个位置时可以选择触发该位置的事件&#xff08;也可不触发…

Free tour II SPOJ - FTOUR2 点分治 + 树状数组

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个有nnn个点的树&#xff0c;有mmm个点拥堵&#xff0c;连接两个点的一条边有一个美丽值&#xff0c;让你选择一个路径&#xff0c;使其经过的拥堵点数不超过kkk且美丽值最大。 n≤2e5,m≤n,k≤mn\le2…

使用Mutex进行线程处理

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

【NOIP模拟】开車【回退贪心】【multiset】

题意&#xff1a;有 1∼n1 \sim n1∼n nnn 个城市排成一行&#xff0c;给定每个城市的单位距离油价和两个城市间的距离、油箱容量&#xff0c;求 111 到 nnn 最小代价。 用 multiset 来维护当前油箱中的油的价格。 在每个城市假装把油加满。如果发现这个城市的油比油箱里的一…

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

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接算不好算&#xff0c;考虑二分这个中位数midmidmid。 考虑如何checkcheckcheck&#xff0c;这个分情况来就好了&#xff1a; (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指令 &#xff08;重要&#xff09;6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

CSP2020 赛前总结

比赛策略与思路 暴力不好写&#xff0c;没法对拍 ≠\neq​ 稳了签到题要求稳&#xff0c;可以当熟悉环境。但也要注意速度&#xff0c;为后面的题腾出时间。正解调不出来就写暴力&#xff0c;一是确认题意、换下脑筋&#xff0c;二是提供对拍&#xff0c;三是拿到保底分。正…

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

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

CSP-S 2020 游记

本博客建立于 2020 年 11 月 6 日晚&#xff0c;于次日正式认证后更新涉及题目的内容并公开。本人未提前知晓认证试题&#xff0c;请读者不必恐慌。 Day -4 久违地 AK 了一场模拟赛。 Day -2 因为模拟赛不给大样例&#xff0c;T3 T4都A了&#xff0c;反而挂了 SB 模拟和欧拉…

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

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

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

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

【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

题意&#xff1a;有好坏两种点共 nnn 个&#xff0c;每个好点有权值&#xff0c;把这 nnn 个点连成一棵树&#xff0c;一个好点为有用的当且仅当它至少与一个好点相邻&#xff0c;求所有有用的点的权值和不超过 limlimlim 的方案数。 n≤40n\leq 40n≤40 这题网上的容斥方法基…

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

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

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

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

【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

题意&#xff1a;给定 nnn 个数 aia_iai​ &#xff0c;求选出&#xff08;可以重复&#xff0c;考虑顺序&#xff09;MMM 个数和为 SSS 的方案数模 222。 n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq 10^5,M,S\leq 10^{18}n≤200,ai​≤105,M,S≤1018 首先给每个数分配一个出…

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

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

P4824 [USACO15FEB]Censoring S kmp + 栈

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