Unity-ML-Agents-Food Collector环境-FoodCollectorSettings.cs

这篇具有很好参考价值的文章主要介绍了Unity-ML-Agents-Food Collector环境-FoodCollectorSettings.cs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Recording Statistics:https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/Learning-Environment-Design.md#recording-statistics

环境链接:https://github.com/Unity-Technologies/ml-agents/tree/release_19/Project/Assets/ML-Agents/Examples/FoodCollector

官方链接:https://github.com/Unity-Technologies/ml-agents/blob/release_19/Project/Assets/ML-Agents/Examples/FoodCollector/Scripts/FoodCollectorSettings.cs

https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/ML-Agents-Overview.md#additional-features

目录

1.FoodCollectorSettings.cs

1.1 FoodCollectorSettings类

1.1.1 using UnityEngine.UI

1.1.2 public Text scoreText

1.1.3 StatsRecorder m_Recorder

1.2 Awake()函数

1.2.1 Academy.Instance.OnEnvironmentReset += EnvironmentReset

1.2.2 m_Recorder = Academy.Instance.StatsRecorder

1.3 EnvironmentReset()

1.3.1 foreach (var fa in listArea)

1.4 ClearObjects()

1.5 Update()

1.5.1 scoreText.text = $"Score: {totalScore}"

1.5.2 m_Recorder.Add("TotalScore", totalScore)


1.FoodCollectorSettings.cs

using UnityEngine;
using UnityEngine.UI;
using Unity.MLAgents;

public class FoodCollectorSettings : MonoBehaviour
{
    [HideInInspector]
    public GameObject[] agents;  // 所有代理的 GameObject 数组
    [HideInInspector]
    public FoodCollectorArea[] listArea;  // 所有 FoodCollectorArea 的数组

    public int totalScore;  // 总得分
    public Text scoreText;  // 显示得分的 UI Text 对象

    StatsRecorder m_Recorder;  // 记录环境统计信息的 StatsRecorder 对象

    public void Awake()
    {
        // 注册 OnEnvironmentReset 方法,当环境被重置时执行
        Academy.Instance.OnEnvironmentReset += EnvironmentReset;
        m_Recorder = Academy.Instance.StatsRecorder;  // 获取 StatsRecorder 对象
    }

    void EnvironmentReset()
    {
        // 清除所有标签为 "food" 的 GameObject
        ClearObjects(GameObject.FindGameObjectsWithTag("food"));
        // 清除所有标签为 "badFood" 的 GameObject
        ClearObjects(GameObject.FindGameObjectsWithTag("badFood"));

        // 获取所有标签为 "agent" 的 GameObject 并存入 agents 数组
        agents = GameObject.FindGameObjectsWithTag("agent");
        // 获取所有 FoodCollectorArea 并存入 listArea 数组,重置每个 FoodCollectorArea 的食物
        listArea = FindObjectsOfType<FoodCollectorArea>();
        foreach (var fa in listArea)
        {
            fa.ResetFoodArea(agents);
        }

        totalScore = 0;  // 总得分清零
    }

    void ClearObjects(GameObject[] objects)
    {
        // 遍历所有 GameObject,销毁它们
        foreach (var food in objects)
        {
            Destroy(food);
        }
    }

    public void Update()
    {
        scoreText.text = $"Score: {totalScore}";  // 显示总得分

        // 每 100 帧发送环境统计信息到 SideChannel,这些值将被平均每 summary_frequency 步,因此不需要每次 Update() 调用都发送
        if ((Time.frameCount % 100) == 0)
        {
            m_Recorder.Add("TotalScore", totalScore);
        }
    }
}

这段代码是一个Unity脚本,它是FoodCollector场景中的游戏管理器,负责管理游戏的各种设置和重置环境。在FoodCollector游戏中,玩家需要控制代理来收集食物,避开毒物,以获得更高的分数。

在脚本中,有以下的功能:

  • agentslistArea 数组:用于存储场景中的所有代理和食物区域(即游戏中的区域,包含食物和毒物)。
  • totalScorescoreText:用于存储当前分数和在UI中显示分数的文本。
  • m_Recorder:用于记录游戏中的统计信息,这些信息可以通过TensorBoard可视化分析。
  • Awake() 函数:在游戏对象唤醒时,为 OnEnvironmentReset 事件添加事件处理程序,并初始化统计信息记录器。
  • EnvironmentReset() 函数:用于重置游戏环境,清除场景中的食物和毒物,重新设置食物区域,并重置分数。
  • ClearObjects() 函数:用于清除场景中指定标签的所有游戏对象。
  • Update() 函数:每帧更新UI中的分数显示,并定期将分数统计信息记录到 m_Recorder

1.1 FoodCollectorSettings类

using UnityEngine.UI;

public class FoodCollectorSettings : MonoBehaviour
{

    public int totalScore;  // 总得分
    public Text scoreText;  // 显示得分的 UI Text 对象

    StatsRecorder m_Recorder;

}

1.1.1 using UnityEngine.UI

using UnityEngine.UI;

UnityEngine.UI 是 Unity 引擎中用于实现 UI 界面的命名空间,包括了常见的 UI 元素类,例如 TextButtonImage 等。在使用这些类之前,需要先添加引用:using UnityEngine.UI;,这样可以避免每次使用时都需要输入完整的命名空间。

1.1.2 public Text scoreText

public Text scoreText;

这行代码定义了一个名为scoreText的公共变量,其类型为Text。在Unity中,Text是用于显示文本的组件。定义公共变量可以让其他脚本访问和修改该变量。这个变量通常用于在游戏界面上显示游戏分数等信息。

1.1.3 StatsRecorder m_Recorder

StatsRecorder m_Recorder; 

StatsRecorder是ML-Agents中的一个类,它用于记录模拟器的统计数据。在这个代码段中,m_Recorder是一个StatsRecorder类型的变量,它被赋值为Academy.Instance.StatsRecorder。这意味着该变量指向ML-Agents中全局的统计记录器实例,可以使用它来记录模拟器中的数据,比如训练期间的分数,完成的任务数等等。

1.2 Awake()函数

    public void Awake()
    {
        // 注册 OnEnvironmentReset 方法,当环境被重置时执行
        Academy.Instance.OnEnvironmentReset += EnvironmentReset;
        m_Recorder = Academy.Instance.StatsRecorder;  // 获取 StatsRecorder 对象
    }

Awake() 是 MonoBehaviour 的一个生命周期函数,用于在场景中创建一个物体时进行初始化。当场景中创建一个包含 FoodCollectorSettings 脚本的游戏对象时,Awake() 函数会被调用一次

在这个函数中,首先调用 Academy.Instance.OnEnvironmentReset += EnvironmentReset; 语句,将 EnvironmentReset() 函数注册到了 OnEnvironmentReset 事件中,这个事件是在每个Episode(训练周期)开始时触发的。这样,当Agent开始一个新的训练周期时,EnvironmentReset() 函数就会被调用,用于重置场景状态和数据。

接着,使用 Academy.Instance.StatsRecorder 获取了一个名为 m_RecorderStatsRecorder 对象,该对象用于在训练过程中收集统计信息,例如每个Episode的得分情况,用于在训练过程中监控智能体的学习效果。这样在后续的代码中就可以使用 m_Recorder 对象来收集并发送统计信息。

1.2.1 Academy.Instance.OnEnvironmentReset += EnvironmentReset

  Academy.Instance.OnEnvironmentReset += EnvironmentReset;

这行代码用于将 EnvironmentReset 方法添加到 Academy 实例的 OnEnvironmentReset 事件中OnEnvironmentReset 事件在每次环境重置时触发。在本例中,当环境重置时,EnvironmentReset 方法被调用。因此,通过这行代码,当环境重置时,可以确保 EnvironmentReset 方法被自动调用。

1.2.2 m_Recorder = Academy.Instance.StatsRecorder

 m_Recorder = Academy.Instance.StatsRecorder; 

这行代码的作用是将ML-Agents Academy实例的统计记录器(StatsRecorder)存储到类成员变量m_Recorder中,以便在后续代码中使用StatsRecorder负责收集训练期间的统计信息(例如训练损失、奖励等),并将其发送到TensorBoard中进行可视化分析。通过将m_Recorder成员变量设置为Academy.Instance.StatsRecorder,可以轻松地记录并发送任何自定义的统计信息。

1.3 EnvironmentReset()

    void EnvironmentReset()
    {
        // 清除所有标签为 "food" 的 GameObject
        ClearObjects(GameObject.FindGameObjectsWithTag("food"));
        // 清除所有标签为 "badFood" 的 GameObject
        ClearObjects(GameObject.FindGameObjectsWithTag("badFood"));

        // 获取所有标签为 "agent" 的 GameObject 并存入 agents 数组
        agents = GameObject.FindGameObjectsWithTag("agent");
        // 获取所有 FoodCollectorArea 并存入 listArea 数组,重置每个 FoodCollectorArea 的食物
        listArea = FindObjectsOfType<FoodCollectorArea>();
        foreach (var fa in listArea)
        {
            fa.ResetFoodArea(agents);
        }

        totalScore = 0;  // 总得分清零
    }

EnvironmentReset 函数在每次环境重置时被调用,它的作用是:

①清除之前生成的所有标签为 "food" 的游戏对象和标签为 "badFood" 的游戏对象。

②获取所有标签为 "agent" 的游戏对象,并将它们存入 agents 数组。

③获取所有的 FoodCollectorArea 组件,将它们存入 listArea 数组,并重置每个 FoodCollectorArea 中的食物。

④将 totalScore 清零,准备开始新的一轮游戏。

1.3.1 foreach (var fa in listArea)

        foreach (var fa in listArea)
        {
            fa.ResetFoodArea(agents);
        }

这段代码的作用是对每个 FoodCollectorArea 进行重置操作。在重置过程中,每个 FoodCollectorArea 的食物需要重新生成并放置在特定的位置,这些位置是与所有 agent 相关的。因此,需要传递 agents 数组作为参数,使每个 FoodCollectorArea 的食物与所有 agent 有关。这个过程中会调用 FoodCollectorArea 类中的 ResetFoodArea 方法来完成具体的重置操作。

1.4 ClearObjects()

    void ClearObjects(GameObject[] objects)
    {
        // 遍历所有 GameObject,销毁它们
        foreach (var food in objects)
        {
            Destroy(food);
        }
    }

这个函数的作用是清除所有传入数组 objects 中的 GameObject 对象。它首先遍历数组中的每个 GameObject,然后使用 Destroy() 函数销毁它们。在这段代码中,它被用来清除所有标签为 "food" 和 "badFood" 的 GameObject,因为这些 GameObject 会在环境重置时被重新生成。

1.5 Update()

    public void Update()
    {
        scoreText.text = $"Score: {totalScore}";  // 显示总得分

        // 每 100 帧发送环境统计信息到 SideChannel,这些值将被平均每 summary_frequency 步,因此不需要每次 Update() 调用都发送
        if ((Time.frameCount % 100) == 0)
        {
            m_Recorder.Add("TotalScore", totalScore);
        }
    }

这段代码是在游戏每一帧更新时调用的,它的主要作用是更新显示总得分的文本和将总得分发送给 StatsRecorder,以便将其记录在 TensorBoard 中。

首先,它将 totalScore 显示在 UI 中,以字符串 "Score: " 为前缀。

然后,它检查帧数是否为 100 的倍数,如果是,则将当前总得分值 totalScore 通过 StatsRecorder 发送到 TensorBoard 中。StatsRecorder 是一个用于记录环境统计信息的类,可以记录一些代理的学习进度、环境统计信息等。发送环境统计信息到 SideChannel,这些值将被平均每 summary_frequency 步,因此不需要每次 Update() 调用都发送,减轻了资源消耗。

问:这些统计信息可以通过 StatsRecorder 对象的 Add() 方法添加到 SideChannel 中,以便在 TensorBoard 中进行可视化和分析?SideChannel ?

这些统计信息可以通过 StatsRecorder 对象的 Add() 方法添加到 SideChannel 中。SideChannel 是 Unity ML-Agents 用于在训练期间传输数据的可选通道,它们提供了一种机制来共享和访问来自环境、代理和其他来源的数据。SideChannel 通常用于跟踪和分析训练期间的统计信息,例如训练代理的总回报或每个代理的动作分布等。StatsRecorder 是一种方便的 SideChannel,它可以用于记录任意数量的统计信息,并将它们发送到 TensorBoard 中进行分析和可视化。

1.5.1 scoreText.text = $"Score: {totalScore}"

scoreText.text = $"Score: {totalScore}"; 

这行代码将总得分 totalScore 显示在 UI 元素 scoreText 上,其中 $"Score: {totalScore}" 是一个字符串插值表达式,将字符串 "Score: " 和 totalScore 的值插入其中,形成最终的文本字符串。通过将该文本赋值给 scoreText.text 属性,更新 UI 元素上的文本显示。如果当前 totalScore 的值为 10,那么最终的文本字符串会是 "Score: 10"。

1.5.2 m_Recorder.Add("TotalScore", totalScore)

m_Recorder.Add("TotalScore", totalScore)

这句代码将当前的总得分值 totalScore 添加到 StatsRecorder 对象的 TotalScore 统计信息中。这些统计信息可以通过 StatsRecorder 对象的 Add() 方法添加到 SideChannel 中,以便在 TensorBoard 中进行可视化和分析。在这里,每隔 100 帧发送一次环境统计信息,以减少发送的数据量,提高效率。

问 :"TotalScore" ?

"TotalScore" 是指将被记录到 TensorBoard 中的数据的名称。在这个例子中,我们将记录每个环境重置后的总分数。通过将名称设置为"TotalScore",我们可以轻松地在 TensorBoard 中找到此数据并进行分析和比较。当然,您可以将其设置为任何您喜欢的名称,只要在后续分析过程中使用相应的名称即可。

问:m_Recorder ?

m_Recorder 是一个 StatsRecorder 类型的变量,它是 Unity ML-Agents 中的一个工具,用于记录和保存模型的统计信息,例如奖励、损失、成功率等等。可以通过它将这些统计信息发送到 TensorBoard 中进行可视化分析。在这段代码中,使用 m_Recorder.Add() 方法将当前的总得分 totalScore 记录下来,并指定了它在 TensorBoard 中的名称为 "TotalScore",以便在 TensorBoard 中进行查看和分析。文章来源地址https://www.toymoban.com/news/detail-457062.html

到了这里,关于Unity-ML-Agents-Food Collector环境-FoodCollectorSettings.cs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity-ML-Agents注意事项及报错、警告等解决方式

    在 ml-agents 0.16.0 版本中,Unity 中的 ML-Agents 插件中包含了名为 Brain 的组件,用于控制智能体的决策过程。然而,在 ml-agents 0.28.0 版本中,该组件已经被重构为 IAgent 接口和 Agent 类。因此,如果您正在使用 ml-agents 0.28.0 或更高版本,您不会在 Unity 的 \\\"Add Component\\\" 菜单中找到 Br

    2024年02月09日
    浏览(38)
  • ML-Agents与自己的强化学习算法通讯——PPO篇

    在上一篇文章ML-Agents与python的Low Level API通信中,我简要介绍了Python与Unity端的ML-Agents插件的通讯代码,如何正确运行一个能够进行强化学习训练的Unity环境,并获取到响应的信息,接下来将介绍如何利用自己的强化学习算法进行训练。 这里我利用了强化学习库PARL来训练ML-Ag

    2023年04月18日
    浏览(48)
  • Unity的ML-agent训练教程(附环境配置流程)

    1)创建虚拟环境 下载好anaconda后打开anaconda prompt,新建虚拟环境,命名为Unity,通过以下指令: 接下来提过指令 激活虚拟环境Unity 2)在虚拟环境内配置需要用的库 在GitHub上下载unity官方的ml-agent包仓库,下载到位置 在anaconda prompt通过依次输入指令导入库文件 一般会因为网速

    2024年02月20日
    浏览(35)
  • Unity Perception合成数据生成、标注与ML模型训练

    在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 任何训练过机器学习模型的人都会告诉你,模型是从数据得到的,一般来说,更多的数据和标签会带来更好的性能。 收集数据,尤其是标记数据非常耗时,因此成

    2024年02月06日
    浏览(46)
  • ML类CFAR检测器在不同环境中检测性能的分析

    摘要:该文是楼主翻阅书籍以及一些论文总结出来的关于ML(均值)类CFAR检测器在不同环境中的性能对比,以及优缺点的总结,可以帮助大家面对不同情形如何选择CFAR问题。由于楼主见识短浅,文中难免出现不足之处,望各位指出。          首先在均匀杂波背景中,采用平

    2024年02月13日
    浏览(38)
  • 【边缘端环境配置】英伟达Jetson系列安装pytorch/tensorflow/ml/tensorrt环境(docker一键拉取)

    Jetson系列板卡是算法边缘端部署无法避开的一道坎,作为英伟达旗下产品,可以使用tensorrt加速,因此用户较多,生态较好;但是由于是ARM架构,因此无法使用x86部署方式,用过的都有一堆血泪史可以诉说,以下是英伟达官方介绍: NVIDIA® Jetson™ 是适用于自主机器和其他嵌入

    2023年04月22日
    浏览(53)
  • 【0218】当SIGQUIT kill掉stats collector后,stats collector如何保存最终统计数据

    stats collector进程的主体函数是 PgstatCollectorMain() ,该函数内部完成了stats collector进程的信号注册、现有统计文件读取、消息处理等任务。 忽略通常与postmaster中的某些操作绑定的所有信号, SIGHUP 和 SIGQUIT 除外。 注意,我们不需要 SIGUSR1 处理程序来支持latch 操作,因为我们只使

    2024年02月10日
    浏览(97)
  • 论文翻译:Text-based Image Editing for Food Images with CLIP

    图1:通过文本对食品图像进行处理的结果示例。最左边一栏显示的是原始输入图像。\\\"Chahan\\\"(日语中的炒饭)和 \\\"蒸饭\\\"。左起第二至第六列显示了VQGAN-CLIP所处理的图像。每个操作中使用的提示都是将食物名称和 \\\"与 \\\"一个配料名称结合起来。例如,第二列中的两幅图像分别是

    2024年02月16日
    浏览(48)
  • SkyWalking链路追踪-Collector(收集器)

    SkyWalking的Collector(收集器)是SkyWalking链路追踪的核心组件之一。它负责接收来自各个Agent的追踪数据,并将其存储到数据存储器(如数据库)中。具体来说,Collector提供了一个统一的接口,用于接收和处理从Agent发送过来的数据。 数据接收:Collector提供接口和服务来接收来自

    2024年02月15日
    浏览(42)
  • AtCoder Beginner Contest 302 H. Ball Collector 题解

    为了更好的阅读体验,请单击这里 AtCoder Beginner Contest 302 H. Ball Collector 题意跳过。 可以视作将 (a_i, b_i) 之间连了一条边,然后 (a_i, b_i) 之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包