Python + Unity Enhanced Learning (Lernen)

Nach dem letzten Umgebungsaufbau werden wir tatsächlich verbessertes Lernen mit Unity durchführen! Klicken Sie hier für den vorherigen Artikel, https://qiita.com/nol_miryuu/items/32cda0f5b7172197bb09

Voraussetzungen

Grundkenntnisse in Unity sind erforderlich (Erstellen und Benennen von Objekten)

Zweck

Trainiere die KI so, dass sich die blaue Kugel (AI Agent) schnell der gelben Box (Ziel) nähern kann, ohne vom Boden zu fallen

Verfassung

Zustand: Vektorbeobachtung (Größe = 8) ・ Drei X-, Y- und Z-Koordinaten des Ziels ・ Drei der X-, Y- und Z-Koordinaten von RollerAgent -Roller Agent Geschwindigkeit in X- und Z-Richtung (ausgeschlossen, da er sich nicht in Y-Richtung bewegt)

Aktion: Kontinuierlich (Größe = 2) ・ 0: Die Kraft, die in X-Richtung auf das Walzenmittel ausgeübt wird ・ 1: Die Kraft, die in Z-Richtung auf das Walzenmittel ausgeübt wird

Belohnung: ・ Wenn sich der Roller Agent dem Ziel nähert (der Abstand zwischen dem Roller Agent und dem Ziel nähert sich 0), wird eine Belohnung (+1,0) vergeben und die Episode ist abgeschlossen. -Wenn der Roller Agent vom Boden fällt (wenn die Position des Roller Agent in Y-Richtung kleiner als 0 ist), wird die Episode ohne Belohnung abgeschlossen.

Entscheidung: ・ Alle 10 Schritte

Erweiterter Lernzyklus (Prozess Schritt für Schritt ausgeführt) Statuserfassung → Aktionsentscheidung → Aktionsausführung und Belohnungserfassung → Richtlinienaktualisierung

Lernumgebung vorbereiten

1. Platzieren Sie die blaue Kugel mit dem Namen = RollerAgent

スクリーンショット 2020-09-17 130159.png

2. Platzieren Sie den gelben Feldnamen = Ziel

スクリーンショット 2020-09-17 130710.png

3. Platzieren Sie den Namen der Etage = Etage

スクリーンショット 2020-09-17 130728.png

4. Hauptkamera: Stellen Sie die Position und den Winkel der Kamera wie einen roten Kreis ein (um eine Position einzustellen, an der Sie das Ganze gut sehen können).

スクリーンショット 2020-09-17 131155.png

5. Erstellen Sie Material, um jedes Objekt einzufärben (Asset> Erstellen).

スクリーンショット 2020-09-17 131256.png

6. Wählen Sie im Menü im Fenster (ML-Agent importieren) die Option Paketmanager.

スクリーンショット 2020-09-17 131422.png

Drücken Sie die Taste "+" oben links und wählen Sie "Paket von Festplatte hinzufügen"

スクリーンショット 2020-09-17 131435.png

Wechseln Sie in das Verzeichnis, das Sie zuletzt erstellt haben, und wählen Sie ml-Agents / com.unity.ml-Agents / package.json aus

スクリーンショット 2020-09-17 131629.png

7. Fügen Sie dem RollerAgent eine Komponente (Funktion) hinzu (blaue Kugel).

・ Rigidbody: Mechanismus der physikalischen Simulation ・ Verhaltensparameter: Legen Sie den Status und die Verhaltensdaten des Walzenagenten fest ・ Entscheidungsanforderer: Legen Sie fest, wie viele Schritte erforderlich sind, um "Entscheidung" anzufordern. `` Grundsätzlich wird der Schritt alle 0,02 Sekunden ausgeführt. Wenn der Entscheidungszeitraum "5" ist, dann alle 5 x 0,02 = 0,1 Sekunden, Im Fall von "10" wird "Entscheidung" alle 10 x 0,02 = 0,2 Sekunden ausgeführt. Stellen Sie für den Walzenagenten schließlich wie in der folgenden Abbildung gezeigt ein.


Rigidbody スクリーンショット 2020-09-17 140104.png


Behavior Paramenters -Verhaltensname: RollerBall (Modell wird mit diesem Namen generiert) ・ Raumgröße der Vektorbeobachtung: 8 (Art des Beobachtungszustands) ・ Raumtyp: Kontinuierlich (Art der Aktion) ・ Raumgröße der Vektoraktion: 2 (Art der Aktion) スクリーンショット 2020-09-17 140130.png


Decision Requester スクリーンショット 2020-09-17 140311.png

8. Erstellen Sie das Skript RollerAgents.cs

・ Void Initialize () ・ ・ ・ Wird nur einmal aufgerufen, wenn das Agentenspielobjekt erstellt wird ・ OnEpisodeBegin () ・ ・ ・ Wird zu Beginn der Episode aufgerufen

RollerAction


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;

public class RollerAgent : Agent
{
    public Transform target;
    Rigidbody rBody;

    public override void Initialize()
    {
        this.rBody = GetComponent<Rigidbody>();
    }

    //Wird zu Beginn der Episode aufgerufen
    public override void OnEpisodeBegin()
    {
        if (this.transform.position.y < 0) //Setzen Sie Folgendes zurück, wenn der RollerAgent (Kugel) vom Boden fällt
        {
            this.rBody.angularVelocity = Vector3.zero; //Rotationsbeschleunigung zurücksetzen
            this.rBody.velocity = Vector3.zero;         //Geschwindigkeit zurücksetzen
            this.transform.position = new Vector3(0.0f, 0.5f, 0.0f); //Position zurücksetzen
        }
        //Setzen Sie die Position des Ziels (Würfels) zurück.
        target.position = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
    }

    //Stellen Sie die Beobachtungsdaten (8 Elemente) ein, die an den Agenten übergeben werden sollen
    public override void CollectObservations(VectorSensor sensor)
    {
        sensor.AddObservation(target.position); //XYZ-Koordinaten des Ziels (Würfel)
        sensor.AddObservation(this.transform.position); //Roller Agent XYZ-Koordinaten
        sensor.AddObservation(rBody.velocity.x); //Geschwindigkeit der X-Achse des Walzenagenten
        sensor.AddObservation(rBody.velocity.z); //Geschwindigkeit der Z-Achse des Walzenmittels
    }

    //Wird beim Ausführen einer Aktion aufgerufen
    public override void OnActionReceived(float[] vectorAction)
    {
        //Schalten Sie den Roller Agent ein
        Vector3 controlSignal = Vector3.zero;

        controlSignal.x = vectorAction[0]; //Legen Sie die durch die Richtlinie festgelegten Verhaltensdaten fest
                                                              // vectorAction[0]Wird die Kraft in X-Richtung ausgeübt?(-1.0 〜 +1.0)
        controlSignal.z = vectorAction[1]; //Legen Sie die durch die Richtlinie festgelegten Verhaltensdaten fest
                                                              // vectorAction[1]Wird die Kraft in Y-Richtung ausgeübt?(-1.0 〜 +1.0)

        rBody.AddForce(controlSignal * 10);

        //Messen Sie den Abstand zwischen Walzenmittel und Ziel
        float distanceToTarget = Vector3.Distance(this.transform.position, target.position);

        //Wenn der Roller Agent an der Zielposition ankommt
        if(distanceToTarget < 1.42f)
        {
            AddReward(1.0f); //Gib eine Belohnung
            EndEpisode(); //Beende die Episode
        }

        //Wenn der Roller Agent vom Boden fällt
        if(this.transform.position.y < 0)
        {
            EndEpisode(); //Schließe Episoden ohne Belohnung ab
        }
    }
}

9. Legen Sie die RollerAgent-Eigenschaften fest

Maximaler Schritt: Die Episode ist abgeschlossen, wenn die maximale Anzahl von Schritten der Episode und die Anzahl der Schritte der Episode die festgelegten Werte überschreiten. Wählen Sie Max Step 1000, gelbes Feld "Target" im Feld Target

10. Erstellen einer Datei mit hohen Parametereinstellungen

-Erstellen Sie ein Beispielverzeichnis in ml-agent / config / -Erstellen Sie eine RollerBall.yaml-Datei darin, der Dateiinhalt ist wie folgt

`Hyperparameter (Trainingseinstellungsdateierweiterung .yaml [als yamuru gelesen])

RollerBall.yaml


behaviors:
  RollerBall:
    trainer_type: ppo
    summary_freq: 1000
    hyperparameters:
      batch_size: 10
      buffer_size: 100
      learning_rate: 0.0003
      learning_rate_schedule: linear
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
    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

Beginnen Sie mit dem Erlernen von Roller Agent

Führen Sie die im vorherigen Qitta erstellte virtuelle Umgebung aus

terminal


poetry shell

Führen Sie den folgenden Befehl im ml-Agentenverzeichnis aus

terminal


mlagents-learn config/sample/RollerBall.yaml --run-id=model01

Das letzte Modell01 gibt jedes Mal einen Alias, wenn es neu trainiert wird

terminal


Start training by pressing the Play button in the in the Unity Editor.

Wenn der obige Code in das Terminal geschrieben wurde, kehren Sie zu Unity zurück und drücken Sie die Wiedergabetaste, um ihn auszuführen

1. Drücken Sie die Unity-Wiedergabetaste, um das Training zu starten.

Alle 50000 Schritte werden Informationen auf dem Terminal angezeigt. Mittlere Belohnung: Durchschnittliche Belohnungspunkte ... Je höher der Wert, desto höher die Genauigkeit. Wenn er 1,0 erreicht, beenden wir das Training.

Recommended Posts

Python + Unity Enhanced Learning (Lernen)
Python + Unity Verbesserte Erstellung von Lernumgebungen
Erweitertes Lernen 1 Python-Installation
Verbessertes Lernen ab Python
Python lernen
[Einführung] Stärkung des Lernens
[Python] Lernnotiz 1
Python-Lernnotizen
Python-Lernausgabe
Python-Lernseite
Python-Lerntag 4
Zukünftiges Verstärkungslernen_2
Zukünftiges Verstärkungslernen_1
Python Deep Learning
Python-Lernen (Ergänzung)
Deep Learning × Python
Python-Lernnotizen
[Python] Probieren Sie mit Keras-RL ganz einfach erweitertes Lernen (DQN) aus
Python-Klasse (Python-Lernnotiz ⑦)
Python lernen mit ChemTHEATER 03
"Objektorientiert" mit Python gelernt
Python-Modul (Python-Lernnotiz ④)
Python lernen mit ChemTHEATER 05-1
Stärkung des Lernens 3 OpenAI-Installation
Python ~ Grammatikgeschwindigkeit lernen ~
Python: Unüberwachtes Lernen: Grundlagen
Stärkung des Lernens der dritten Zeile
Private Python-Lernprozedur
Python lernen mit ChemTHEATER 02
[Lernen stärken] Banditenaufgabe
Python lernen mit ChemTHEATER 01
Python: Deep Learning Tuning
Python: Überwachtes Lernen (Rückkehr)
Stärkung des Lernens 1 Einführungsausgabe
Python: Überwachtes Lernen (Klassifizierung)
Stärkung des Lernens 18 Colaboratory + Acrobat + ChainerRL
Behandlung von Python-Ausnahmen (Python-Lernnotiz ⑥)
Verbessertes Lernen 7 Protokollieren Sie die Ausgabe von Lerndaten
O'Reilly python3 Primer Lernnotiz
Stärkung des Lernens 17 Colaboratory + CartPole + ChainerRL
Stärkung des Lernens 28 colaboratory + OpenAI + chainerRL
Python: Überwachtes Lernen: Hyperparameter Teil 1
Stärkung des Lernens 2 Installation von Chainerrl
[Lernen stärken] Tracking durch Multi-Agent
Stärkung des Lernens 20 Colaboratory + Pendulum + ChainerRL
Maschinelles Lernen mit Python! Vorbereitung
Verstärkungslernen 5 Versuchen Sie, CartPole zu programmieren?
Verstärkungslernen 9 ChainerRL Magic Remodeling
Lernen stärken Lernen Sie von heute
Lernnotizen zur Python-Datenanalyse
Python Machine Learning Programming> Schlüsselwörter
Python: Überwachtes Lernen: Hyperparameter Teil 2