Unity2019官网项目机器学习02

473 阅读2分钟

开发工具

  • Unity2019.4.7f1
  • 3D

安装插件

导入完成

布置场景

1.创建面板 首先将坐标控制为0,0,0,位置 创建两个球体,两个材质体 设置红球可以移动

  • 为红球添加刚体 此时,两个球体,自身都有碰撞检测器Sphere Collider

设置摄像机的场景

首先选择Main Camera 在导航栏中选择GameObject ->Align With View or Ctrl+Shift+F 规范:创建文件夹存放脚本 设置Unity脚本编辑器

创建脚本RollerAgent,继承自Agent智能体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入命名空间
using Unity.MLAgents;
using Unity.MLAgents.Sensors;

public class RollerAgent : Agent
{
    public Transform transform;

    Rigidbody rBody;

    // Start is called before the first frame update
    void Start()
    {
        rBody = GetComponent<Rigidbody>();
    }

    //进入新一轮调用的函数
    public override void OnEpisodeBegin()
    {
        base.OnEpisodeBegin();
    }
    //收集观察的结果
    public override void CollectObservations(VectorSensor sensor)
    {
        base.CollectObservations(sensor);
    }
    //接收动作是否得到奖励
    public override void OnActionReceived(float[] vectorAction)
    {
        print("Horizontal" + vectorAction[0]);
        print("Vertical" + vectorAction[1]);
    }
    //是否手动操作智能体  
    public override void Heuristic(float[] actionsOut)
    {
        //拿到水平垂直的位置
       actionsOut[0] = Input.GetAxis("Horizontal");
       actionsOut[1] = Input.GetAxis("Vertical");
    }
}
  • 继续为AI添加脚本 上图第四个,启发式类型,和代码一样:是否手动操作智能体
    运行:
  • 让红球跟着移动

public float speed=10; //定义一个速度

 //设置位置
  Vector3 control = Vector3.zero;
  control.x = vectorAction[0];
  control.z = vectorAction[1];
  rBody.AddForce(control * speed);

重置游戏

//进入新一轮调用的函数
    public override void OnEpisodeBegin()
    {
        print("Start");
        //重新开始小球的位置
        this.transform.position = new Vector3(2, 0.5f, 0);
        //速度和旋转
        this.rBody.velocity = Vector3.zero;
        this.rBody.angularVelocity = Vector3.zero;

        //base.OnEpisodeBegin();
    }

接收动作 - 设置智能体奖励

此时分成两处代码块

  • 1.狗子出界
        if (this.transform.position.y<0)
        {//掉到外部-结束此轮游戏
            EndEpisode();
        }
  • 2.狗子成功 判断条件 - 物体相碰
float distance = Vector3.Distance(this.transform.position,target.position);

        if (distance < 1.4f)
        {//小球距离
            print("狗子成功了");
            SetReward(1.0f);
            EndEpisode();
        }

随机Target的位置并收集观察结果

在开始的方法OnEpisodeBegin中添加

  • 随机生成骨头的位置

target.position = new Vector3(Random.value*8-4,0.5f, Random.value * 8 - 4);

收集观察结果完成前期训练准备

CollectObservations方法中

//收集观察的结果
    public override void CollectObservations(VectorSensor sensor)
    {//--添加观察者
        //当前位置坐标,targer的坐标
        sensor.AddObservation(target.position);
        sensor.AddObservation(this.transform.position);

        //速度 x,z
        sensor.AddObservation(rBody.velocity.x);
        sensor.AddObservation(rBody.velocity.z);

        //base.CollectObservations(sensor);
    }

Unity面板中

    1. 修改Behavior Name

RollerBall

  • 2. Space Size观察几个值

一个Position是三个值,即x,y,z

x,z轴的速度都是一个float的值 所以是两个值

3+3+1+1=8个

  • 3. Stacked Vectors 压缩成几位的向量

1

  • 4. Vector Action 监听多少向量 Heuristic方法中监听的float值 x+y=2

    1. Behavior Type 启发学习

改成默认Default

训练

  • 1.新建文件夹 放入
  • config.yaml文件 注意:RollerBall名字和上述的Unity面板1中的Behavior Name相同
behaviors:
  RollerBall:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 12000
      learning_rate: 0.0003
      beta: 0.001
      epsilon: 0.2
      lambd: 0.99
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 300000
    time_horizon: 1000
    summary_freq: 1000
    threaded: true

打开 激活 activate ml-agents 切换到项目盘 (ml-agents) D:\Desktop\zhao_qian项目集\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml 当前没有使用GPU 说以忽略GPU的错误 运行访问

直接断开了,提示的这个错误是什么呀?
File "d:\_zqstudent\envs\ml-agents\lib\site-packages\mlagents\trainers\learn.py", line 82, in run_training maybe_init_path, File "d:\_zqstudent\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_util.py", line 154, in handle_existing_directories "Previous data from this run ID was found. "
mlagents.trainers.exception.UnityTrainerException: Previous data from this run ID was found. Either specify a new run ID, use --resume to resume this run, or use the --force parameter to overwrite existing data. 

(ml-agents) D:\Desktop\zhao_qian项目集\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml

我的出现了错误,没有使用视屏给的这种

更改后代码

(ml-agents) D:\Desktop\zhao_qianDemo\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml --run-id=firstRun --train 自动移动---切换到 Unity 运行项目,就可以看见开始训练了

-------- 训练结束,断开连接(unity中停止运行) 将文件中的模型赋值 -- 再次运行结束,不用使用cmd命令行

unity安装