質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2209閲覧

ml-agentsでrewardをmonitorしたい

yan_tomo

総合スコア5

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/11/08 09:23

前提・実現したいこと

unityでml-agentを使って強化学習の練習をしています.
こちらにあるようにmonitorクラスを使って報酬を表示したいのですが,
valueとして指定する変数がわかりません.

ご助言よろしくお願いします.

発生している問題・エラーメッセージ

例えばexamplesの3D Ballのコードでmonitor.logのvalueにrewardと入れると以下のコンパイルエラーが発生します.

Assets\ML-Agents\Examples\3DBall\Scripts\Ball3DAgent.cs(56,31): error CS0122: 'Agent.reward' is inaccessible due to its protection level

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using MLAgents; 5 6public class Ball3DAgent : Agent 7{ 8 [Header("Specific to Ball3D")] 9 public GameObject ball; 10 private Rigidbody ballRb; 11 12 public override void InitializeAgent() 13 { 14 ballRb = ball.GetComponent<Rigidbody>(); 15 } 16 17 public override void CollectObservations() 18 { 19 AddVectorObs(gameObject.transform.rotation.z); 20 AddVectorObs(gameObject.transform.rotation.x); 21 AddVectorObs(ball.transform.position - gameObject.transform.position); 22 AddVectorObs(ballRb.velocity); 23 } 24 25 public override void AgentAction(float[] vectorAction, string textAction) 26 { 27 28 if (brain.brainParameters.vectorActionSpaceType == SpaceType.continuous) 29 { 30 var actionZ = 2f * Mathf.Clamp(vectorAction[0], -1f, 1f); 31 var actionX = 2f * Mathf.Clamp(vectorAction[1], -1f, 1f); 32 33 if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) || 34 (gameObject.transform.rotation.z > -0.25f && actionZ < 0f)) 35 { 36 gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ); 37 } 38 39 if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) || 40 (gameObject.transform.rotation.x > -0.25f && actionX < 0f)) 41 { 42 gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX); 43 } 44 } 45 if ((ball.transform.position.y - gameObject.transform.position.y) < -2f || 46 Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f || 47 Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) 48 { 49 Done(); 50 SetReward(-1f); 51 } 52 else 53 { 54 SetReward(0.1f); 55 } 56 Monitor.Log("reward", reward, transform); 57 } 58 59 public override void AgentReset() 60 { 61 gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f); 62 gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f)); 63 gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f)); 64 ballRb.velocity = new Vector3(0f, 0f, 0f); 65 ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f)) 66 + gameObject.transform.position; 67 68 } 69 70} 71

試したこと

monitor.logのvalueにvectorActionなどと入れると正常に描画されるので,報酬を保持する変数が違うのだと思っています.

補足情報(FW/ツールのバージョンなど)

Unity 2019.1.8f1
ml-agents 0.8.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

昔はrewardpublicだったみたいですが、0.8.1ではprivateのようですね。
Monitor.Log("reward", GetReward(), transform);ならどうでしょうか?

投稿2019/11/09 02:03

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yan_tomo

2019/11/11 02:16

ありがとうございます. 無事,rewardを表示することができました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問