让 C# 和 Python 针对此机器学习任务进行通信的最佳方法是什么?



我正在使用Unity为一个大学项目开发一个简单的游戏。这个游戏利用了机器学习,所以我需要TensorFlow来构建一个神经网络(NN),根据NN的预测来完成游戏中的某些动作。

特别是我的学习方法是强化学习。我需要监控环境中的状态和奖励[用C#编码],并将它们传递给NN[用Python编码]。然后,预测[来自 Python 代码] 应发送回环境 [到 C# 代码]。

可悲的是,我对如何让C#和Python进行通信感到非常困惑。我在网上阅读了很多,但没有什么真正帮助我。任何人都可以清除我的想法吗?谢谢。

对于进程间通信来说,绝对值得一看的是(Win32)命名管道。它几乎和写入或读取文件一样简单。比TCP/IP更容易,您甚至可以通过本地网络进行通信,至少如果您具有访问权限。添加您自己的序列化代码并完成。

虽然它有点不对称(在一个方向上,你只需打开一个带有管道名称的文件,在相反的方向上,你必须创建一个命名的管道对象,不记得哪个是哪个)。

例如,请参阅命名管道示例

如果你在谷歌上搜索"命名管道窗口",你会发现大量的信息。但请记住不要使用匿名管道(它们很丑陋)。

您有几个选择:

子流程

您可以通过 Unity 的 C# 打开 python 脚本,然后将标准输出和标准输入数据发送到进程或从流程发送标准输出和标准输入数据。在Python方面,它就像input()print()一样简单,而在C#方面,它基本上是从Stream对象读取和写入(据我所知)

UDP/TCP 套接字

你可以让你的Python成为UDP/TCP服务器(如果你必须传输大量数据,最好是UDP,并且编码可能更简单)。然后,创建一个 C# 客户端并将请求发送到 Python 服务器。python服务器将进行处理(AI魔法,是的!),然后将结果返回到Unity的C#。在C#中,你必须研究UdpClient类,在Python中,socket模块。

您可以使用Python for .NET (pythonnet) 将C#中编译的DLL与python本机集成

pythonnet是一个软件包,它使Python程序员几乎可以无缝地与Windows上的.NET 4.0+公共语言运行时(CLR)和Linux和OSX上的Mono运行时集成。

使用此包,您可以使用以面向 CLR(C#、VB.NET、F#、C++/CLI )的任何语言编写的 .NET 服务和组件,编写 .NET 应用程序脚本或用 Python 构建整个应用程序。

安装

pip install pythonnet

在python中使用编译的类库My.dll:

import clr
clr.AddReference("My.DLL")
# call methods in dll

查看工作示例

GitHub 中的 Python Net

如何在python WIKI中使用包

如果您使用的是 Unity 机器学习代理,那么连接 C# 代码和 python 并不难。

mlagents Python 包包含两个组件:一个允许您直接与 Unity 环境交互的低级 API (mlagents_envs) 和一个训练入口点 (mlagents-learn),它允许您使用我们的强化学习或模仿学习实现在 Unity 环境中训练代理。 有关更多详细信息,请按照此文档进行操作 https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md

有几种方法可以在 C# 和 Python 之间进行通信。以下是一些最常见的方法:

使用管道:可以使用管道将 C# 应用程序连接到 Python 脚本。Python 脚本应该使用 readline 查看标准输入以获取输入。C# 应将输出发送到 Python 脚本标准输入,并确保每个命令 1 的末尾都有换行符。

使用IronPython:IronPython是Python编程语言的开源实现,与.NET Framework紧密集成。您可以使用 IronPython 编写可以从 C# 2 调用的 Python 代码。

使用Pyrolite:Pyrolite是一个库,允许您从C#调用Python代码。它的工作原理是将 Python 代码作为 Pyro4 服务器 2 运行。

使用 TCP/IP:您可以使用 TCP/IP 套接字在 C# 和 Python 之间进行通信。此方法要求您在通信通道 3 的两端编写代码。

机器学习任务的最佳方法将取决于您的特定要求和约束。我希望这有帮助!如果您有任何其他问题,请告诉我。

使用 ML.NET C# 代码运行从 Azure 认知服务自定义视觉导出的 TensorFlow 模型。

最新更新