转自:https://moefactory.com/3004.moe
折腾万岁!
是什么?怎么用?
前段时间突然有了在 C# 中调用 Keras 生成的模型的奇怪需求,本来想的是干脆直接调用 Python 脚本然后传个参进去,但是这样不是很好玩,Google 了一下发现竟然有人把 Python 的几个机器学习框架都移植到了 C# 下,而 Keras.NET 就是其中一个,这下就很有趣了。
Keras.NET 是 SciSharp(是不是很熟悉,Python 中的科学计算工具包叫做 SciPy,不过我不知道这两者是不是一家)移植的用于 .NET 的 Keras 框架,其最大的特点是尽量使 C# 中的语法与 Python 原版的相似。另外 SciSharp 还移植了 NumSharp 等一系列库。关于Keras.NET,可参见:https://www.cnblogs.com/cgzl/p/11145382.html
基于上述特点,Python 代码只需做极少量的改动就能在 C# 中使用,如下所示( 代码摘自 Github 官方 repo)。
这是 Python 代码:
这是 C# 代码:
一些小问题
slice
的替代
目前我用到的功能中和 Python 有点区别的是,尽管 NumSharp 通过字符串作为参数实现了 Python 中的slice
功能,但是并不能像 Python 里一样使用x = x[:, :, :, np.newaxis]
。不过好在就算是 Python,也有另一种方法完成同样的功能,就是np.expand_dims
,对应在 C# 里则是x = np.expand_dims(x, 3);
。
系统架构
需要注意的是,使用 Keras.NET 需要安装版本匹配的 Python,并且仅支持 64 位的 Windows,这也就意味着编译 .NET 程序时不能选择“首选 32 位”。
.NET Core 上的注意事项
最开始我的程序是用 WinForms (.NET Framework 4) 写的,跑起来没什么大问题,就是只能依附于 Visual Studio 的调试模式。后来在微软发布 .NET Core 3 并支持 WPF 之后,九月份迁移项目的时候就出现了问题,一直报一个奇怪的错误,给作者提了 issue 之后也没什么太大的进展。
这学期期末的时候又想起来这个事情,试了一下在 .NET Core 3 下的 Console App 里跑起来是没问题的。于是再次提了一个 issue。最终得知是因为一些 Python 模块会使用sys.strerr
和sys.stdout
来输出一些东西,而 WinForms 和 WPF 是没有控制台的——大概这也是之前不能脱离 Visual Studio 运行的一个问题吧。
解决办法是更新到最新的 Keras.NET 并使用Keras.Keras.DisablePySysConsoleLog = true
来禁用这些输出。如果有获取这些输出的需求,可以使用以下代码:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在 C# 中使用 Keras - Python技术站