【问题标题】:What is the best approach to let C# and Python communicate for this machine learning task?让 C# 和 Python 为这项机器学习任务进行通信的最佳方法是什么?
【发布时间】:2018-08-07 14:18:56
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是哪个操作系统?您可以将 C# 中的 Python 脚本作为系统命令运行。
  • @EmmetB 感谢您的回答,我正在使用 MacOS。好的,我明白了,所以我可以从 C# 代码运行 Python 脚本,将信息发送到我的 NN。但我现在不知道如何将所做的预测转移回我的 C# 代码,但这是另一回事。我可能会寻找如何做到这一点。谢谢。
  • 如果允许,您可以使用 UnityML 库。设置起来非常简单。

标签: c# python unity3d tensorflow machine-learning


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    安装

        pip install pythonnet
    

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

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

    查看working example

    github中的pythonnet

    如何在python中使用包WIKI

    【讨论】:

      【解决方案3】:

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

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

      例如见Example of Named Pipes

      如果您在 Google 上搜索“命名管道窗口”,您会发现大量信息。但请记住不要使用匿名管道(它们很丑)。

      【讨论】:

      • 这是一个非常有用的解决方案,我故意从我的回答中省略了。根据我的经验,许多人只是觉得很困难,出于某种原因。但它绝对值得一试,因为它(理论上)比我的解决方案更简单。
      • 是的,我记得当时我必须做一些研究,但在我看来这是值得的。
      • 哪种方法的开销最小:UDP/TCP 连接还是命名管道?
      • @KaranJoisher:如果您在本地网络上使用管道,那么它们是由 tcp 传输的,因此它们肯定比直接使用 tcp 具有更高的开销。在同一台机器上,它们似乎大致相同。见stackoverflow.com/questions/10872557/…
      • 那么如果在同一台机器上 TCP 和命名管道的性能相似,那么 TCP 和 UDP 哪个更好?因为我的应用程序的数据传输需要是实时的,所以似乎 UDP 应该是首选
      【解决方案4】:

      你有几个选择:

      子进程

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

      UDP/TCP 套接字

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

      【讨论】:

      • 感谢您的回答。这是一个有趣的方法。我会试试看,我会告诉你的。
      • 很高兴听到!祝你的项目好运。
      猜你喜欢
      • 2013-04-25
      • 2010-11-04
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多