ML-Agents(三)3DBall例子
煦阳 人气:0
# ML-Agents(三)3DBall例子
前一周忙着公司的考试,都没有怎么学新的,今天补上~
之后的记录,我准备先只研究官方的示例,主要是把研究过程中的疑惑和想法记下来。首先我先补充一下如何利用GPU进行训练,结合(一)中的安装方法,需要CUDA v10.0,cuDNN v7.6.5 for CUDA v10.0,对应Tensorflow的版本是2.0.1。
## 一、利用GPU进行训练
前置工作在文章(一)中都有,原先的环境可以保留。现在可以拉一个新的ml-agents源码,然后修改`ml-agents`文件下的`setup.py`中如下图:
![image-20200319233335183](https://img2020.cnblogs.com/blog/1659542/202003/1659542-20200329004305918-2041525782.png)
原来是`"tensorflow>=1.7,<2.1"`,现在修改为`"tensorflow-gpu>=1.7,<2.1"`,然后再在Anaconda中新建一个环境,如下:
![image-20200319234037666](https://img2020.cnblogs.com/blog/1659542/202003/1659542-20200329004305192-2003581869.png)
建好后在命令行中重新安装环境(别忘记cd到新的ml-agents源码),分别输入:
`pip install -e ml-agents-envs -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com`
`pip install -e ml-agents -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com`
就是分别安装两个环境,可以发现他会自动下载`tensorflow_gpu-2.0.1`,如下图:
![GPU](https://img2020.cnblogs.com/blog/1659542/202003/1659542-20200329004304425-1500806339.jpg)
配置好后,在Unity对应的Agent脚本上,也需要将`Inference Device`勾选为`GPU`,然后按以前的方法开始训练,就可以了。
![image-20200319233940196](https://img2020.cnblogs.com/blog/1659542/202003/1659542-20200329004303332-428982462.png)
## 二、3DBall
官方示例中,3Dball是一个比较简单的例子,主要运用了reinforcement learning(强化学习)。就是小球在平台上,萌版平台要控制自己绕x、z轴旋转,从而保持小球在自己头上不掉下来。
![3dBall](https://img2020.cnblogs.com/blog/1659542/202003/1659542-20200329004302776-1038401911.gif)
现根据官方文档翻译一下:
- 设置:一个平衡球任务,agent需要保持小球在其脑袋上的平衡
- 目标:Agent必须尽可能长时间地保持球在头顶的平衡
- Agent设置:环境中包含12个想同类型的agent,全部使用同样的行为参数
- Agent奖励设置:
- 小球每一步保持在方块头顶上就奖励+0.1
- 如果小球掉落,惩罚-0.1
- 行为参数
- 矢量观察空间:8个变量,包括agent方块的旋转角度(两个值,x、z轴方向),球和方块之间的相对位置关系(Vector3),球上刚体的速度(Vector3)
- 矢量动作空间:类型为`Continuous`,`Size`为2,分别控制绕x轴旋转、绕z轴旋转
- Float属性:三个
- scale(比例):小球的比例,默认为1,推荐最小值为0.2,最大值为5
- gravity(重力):重力加速度,默认为9.81,推荐最小值4,最大值为105
- mass(质量):小球的质量,默认为1,推荐最小值为0.1,最大值为20
- 基准平均奖励:100
OK,上面是借鉴官方文档,随意翻译了一下,大概可以了解3DBall主要用途和一些主要参数,里面的Float属性我这里不是很明白,在代码中是用在`Agent.InitializeAgent()`中的`SetResetParameters()`,这个方法顾名思义应该是对Agent进行初始化的操作。也许在这里,我们可以任意修改小球的比例、质量、重力加速度来改变小球在不同的情况下,训练的效果如何吧。
## 3DBall代码分析
看到目前为止,ml-agents其中的精华就在agent的脚本如何设置了,我们下面来分析一下`Ball3DAgent`代码。
### 初始化
```c#
public class Ball3DAgent : Agent
{
[Header("Specific to Ball3D")]
public GameObject ball;
Rigidbody m_BallRb;
IFloatProperties m_ResetParams;
public override void InitializeAgent()
{
m_BallRb = ball.GetComponent
加载全部内容