Ich konnte den japanischen Artikel von v0.11.0 nicht finden, daher habe ich ein Memorandum.
Dieser Artikel ist __für Anfänger __. Anfänger von Unity ahmen [eines der offiziellen ML-Agents-Tutorials] nach (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md) Tu es Es ist eines der maschinellen Lernen, __Verstärkungslernen __.
__ Ich werde so etwas machen. : Pfeil nach oben: __
Es ist für Leute, die noch kein maschinelles Lernen gemacht haben, obwohl sie wissen, wie man Unity einfach zum Laufen bringt. Anstatt uns auf die Theorie zu konzentrieren, führen wir sie ein, damit Sie sie erleben können, während Sie Ihre Hände bewegen.
* Dieser Artikel ist ab dem 13. November 2019 aktuell. </ b> ML-Agenten werden schnell aktualisiert. Überprüfen Sie daher immer die neuesten Informationen. ~~ [Buch letztes Jahr veröffentlicht](https://www.amazon.co.jp/Unity%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82 % 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 83% BB% E5% BC% B7% E5% 8C% 96% E5% AD% A6 % E7% BF% 92-Unity-ML-Agenten% E5% AE% 9F% E8% B7% B5% E3% 82% B2% E3% 83% BC% E3% 83% A0% E3% 83% 97% E3 % 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E5% B8% 83% E7% 95% 99% E5% B7% 9D-% E8% 8B% B1% E4% B8% 80 / dp / 48624648181) hat ~~ nicht geholfen (Übrigens, diesjähriger Übergang ⇒ 19. Januar: * v0.6 * ➡ April: * v0.8 * ➡ Oktober: * v0.10 * ➡ Stand November: * v0.11 *)
Es gibt einige wesentliche Wörter für maschinelles Lernen in Unity. Das ist __ "Akademie", "Gehirn" und "Agent" __.
Grundsätzlich steuert "Brain" die Aktionen, die "Agent" in der von "Academy" in Unity definierten Umgebung ausführt. Dieses Mal werden wir das Verstärkungslernen über ein externes TensorFlow (Python-Framework) durchführen und das generierte neuronale Netzwerkmodell in Unity laden und ausführen. (Dies ist ein einfaches Tutorial, daher werde ich die Akademie nicht sehr berühren.)
__ Wenn Sie neu in diesem Bereich sind, können Sie es überspringen. __ __ Ich habe v0.8x und v0.9x verwendet, bin mir aber nicht sicher, weil ich keine Gehirnparameter finden kann. Wenn Sie jedoch nur hier suchen, ist dies möglicherweise in Ordnung.
Bitte installieren Sie zuerst Folgendes.
Unity5 </ b> (Ich denke, es gibt kein Problem, wenn ver auf 2017.4 migriert wird.)
Anaconda 2019.10 </ b> (Bitte wählen Sie 3.7__ für __Python-Version)
ml-Agents-Master \ UnitySDK \ Assets
Floor
Position = (0, 0, 0)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
Zu
-Spielen Sie mit * Element * von * Inpector *> * Materials *, damit es so aussieht, wie Sie es möchten.
Target
Position = (3, 0.5, 3)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
ZuRollerAgent
Position = (0, 0.5, 0)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
Zu
―― Ändern Sie nach wie vor das Erscheinungsbild nach Ihren Wünschen.
Wenn Sie möchten, dass es wie eine Kugel aussieht, wählen Sie das Material "CheckerSquare".
-Add * Rigidbody * von * Add Component *.
Als nächstes werde ich den Inhalt in C # beschreiben.
Akademie
ausgewählt ist, verwenden Sie * Komponente hinzufügen-> Neues Skript *, um ein Skript mit dem Namen RollerAcademy.cs
zu erstellen.RollerAcademy.cs
wie folgt um. Sie können den ursprünglichen Inhalt löschen.RollerAcademy.cs
using MLAgents;
public class RollerAcademy : Academy{ }
In dieser Beschreibung Grundfunktionen wie "Beobachtungsentscheidungsaktion" (hier weggelassen) werden von der Klasse * Academy * an die Klasse * RollerAcademy * vererbt. Es ist also okay mit zwei Zeilen.
Wählen Sie im Fenster * Hierarchie * RollerAgent
und wählen Sie
Erstellen Sie ein Skript mit dem Namen RollerAgent.cs
mit * Add Component-> New Script *.
Schreiben Sie den Inhalt von "RollerAgent.cs" wie folgt um.
RollerAgent.cs
using MLAgents;
public class RollerAgent : Agent{ }
Wie * Academy * liest es den Namespace * MLAgents * und gibt * Agent * als zu erbende Basisklasse an.
Dies ist das grundlegende Verfahren zum Einbinden von ML-Agenten in __Unity. Als nächstes werden wir einen Mechanismus hinzufügen, mit dem der Ball auf die Box zuläuft, indem das Lernen gestärkt wird.
Schreiben Sie den Inhalt von "RollerAgent.cs" wie folgt um.
RollerAgent.cs
using unityEngine;
using MLAgents;
public class RollerAgent:Agent
{
Rigidbody rBody;
void Start(){
rBody = GetComponent<Rigidbody>();
}
public Transform Target;
public override void AgentReset()
{
if (this.transform.position.y < 0)
{
//Rotationsbeschleunigung und Zurücksetzen der Beschleunigung
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
//Bringen Sie den Agenten in die Ausgangsposition zurück
this.transform.position = new Vector3( 0, 0.5f, 0)
}
//Zielverlagerung
Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
Random.value * 8 - 4);
}
}
Hier,
--Nächste __ Verlagerung und Initialisierung __ wenn RollerAgent
die Box erreicht ( Ziel
)
--__ Zurück __ wenn RollerAgent
vom Boden fällt ( Floor
)
Wird verarbeitet.
Rigidbody
ist eine Komponente, die in der physikalischen Simulation von Unity verwendet wird.
Dieses Mal wird es verwendet, um den Agenten auszuführen.
Die Werte von * Position, Rotation, Scale * werden in Transform
aufgezeichnet.
Durch die Definition in "public" kann * Inpector * "Transform" von * Target * übergeben.
Fügen Sie Folgendes in die Klasse von "RollerAgent.cs" ein.
public override void CollectObservations()
{
//Ziel- und Agentenstandort
AddVectorObs(Target.position);
AddvectorObs(This.transform.position);
//Agentengeschwindigkeit
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
}
Hier, __ Verarbeitung zum Sammeln beobachteter Daten als Merkmalsvektor __ Ich mache.
Die 3D-Koordinaten von * Target * und * Agent * und die gesamten 8D-Vektoren von * Agent * -Geschwindigkeiten * x * und * z * werden an das neuronale Netzwerk übergeben. ~~ 8. Dimension ist cool ~~
Fügen Sie die folgende Verarbeitung für die Funktion AgentAction ()
zu RollerAgent.cs
hinzu.
public float speed = 10
public override void AgentAction(float[] vectorAction, string textAction)
{
//Aktion
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0];
controlSignal.z = vectorAction[1];
rBody.AddForce(controlSignal * speed);
//Belohnung
//Ermitteln Sie die Entfernung zur Box (Ziel) aus der Entfernung, die der Ball (Agent) bewegt hat
float distanceToTarget = Vector3.Distance(this.transform.position,
Target.position);
//Wenn die Box (Ziel) erreicht ist
if (distanceToTarget < 1.42f)
{
//Belohnt und abgeschlossen
SetReward(1.0f);
Done();
}
//Wenn Sie vom Boden fallen
if (this.transform.position.y < 0)
{
Done();
}
}
Hier, __Die "Aktion" des Lesens der beiden Arten von Kräften (kontinuierliche Werte) in X- und Z-Richtung und des Versuchs, den Agenten zu bewegen Wir verarbeiten einen Lernalgorithmus, der eine "Belohnung" gibt, wenn der Agent die Box erfolgreich erreicht, und die "Belohnung" aufnimmt, wenn sie fällt.
Die Funktion "AddForce" ist eine Funktion zum Aufbringen physischer Kraft auf ein Objekt mit einer * Rigidbody * -Komponente und zum Verschieben. Erst wenn der Abstand unter dem Referenzwert berechnet wird, um zu beurteilen, ob das Ziel erreicht wurde, wird die Belohnung vergeben und das Zurücksetzen durchgeführt.
Um in komplizierteren Situationen genug zu lernen, ist es effektiv, nicht nur die Belohnung, sondern auch die Bestrafung zu schreiben. ~~ (Bei v0,5x war es "-1", als es vom Boden fiel, aber es scheint, dass es in der neuesten Version als unnötig beurteilt wurde) ~~
RollerAgents.cs
using unityEngine;
using MLAgents;
public class RollerAgent:Agent
{
Rigidbody rBody;
void Start(){
rBody = GetComponent<Rigidbody>();
}
public Transform Target;
public override void AgentReset()
{
if (this.transform.position.y < 0)
{
//Rotationsbeschleunigung und Zurücksetzen der Beschleunigung
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
//Bringen Sie den Agenten in die Ausgangsposition zurück
this.transform.position = new Vector3( 0, 0.5f, 0)
}
//Zielverlagerung
Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
Random.value * 8 - 4);
}
public override void CollectObservations()
{
//Ziel- und Agentenstandort
AddVectorObs(Target.position);
AddvectorObs(This.transform.position);
//Agentengeschwindigkeit
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
}
public override void AgentAction(float[] vectorAction, string textAction)
{
//Aktion
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0];
controlSignal.z = vectorAction[1];
rBody.AddForce(controlSignal * speed);
//Belohnung
//Ermitteln Sie die Entfernung zur Box (Ziel) aus der Entfernung, die der Ball (Agent) bewegt hat
float distanceToTarget = Vector3.Distance(this.transform.position,
Target.position);
//Wenn die Box (Ziel) erreicht ist
if (distanceToTarget < 1.42f)
{
//Belohnt und abgeschlossen
SetReward(1.0f);
Done();
}
//Wenn Sie vom Boden fallen
if (this.transform.position.y < 0)
{
Done();
}
}
}
-Wählen Sie im Fenster * Hierarchie * die Option "RollerAgent" und ändern Sie das Element "RollerAgent (Skript)" um zwei Punkte.
Decision Interval = 10
Target = Target(Transform)
-Add * Komponente hinzufügen> Verhaltensparameter * und ändern Sie die Einstellungen wie folgt.
Behavior Name = RollerBallBrain
Vector Observation Space Size = 8
Vector Action Space Type = Continuous
Vector Action Space Size = 2
Laut offizieller Dokumentation (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md), wenn Sie weiterhin die Standardparameter 30 verwenden Es scheint, dass es Zeit braucht, um 10.000 Schritte zu lernen. Diesmal ist es nicht so kompliziert, also schreiben wir einige der Parameter neu, um die Anzahl der Versuche auf weniger als 20.000 Schritte zu reduzieren.
-Öffnen Sie Trainer_config.yaml
in * ml-Agents-Master-0.11> config> * mit einem Editor (VS-Code oder Editor) und schreiben Sie die Werte der folgenden Elemente neu.
batch_size: 10
buffer_size: 100
Jetzt können Sie trainieren.
Es ist fast Zeit, hierher zu kommen. Bevor Sie das Lernen stärken, überprüfen wir manuell, ob die bisher erstellte Umgebung ordnungsgemäß funktioniert. Implementieren Sie die folgende Methode zusätzlich in der Klasse "RollerAgent.cs".
public override float[] Heuristic()
{
var action = new float[2];
action[0] = Input.GetAxis("Horizontal");
action[1] = Input.GetAxis("Vertical");
return action;
}
Horizontale (horizontale) Eingabeachse mit "Horizontal",
Ermöglicht Vertical
, vertikale (vertikale) Eingabeachsen zu akzeptieren.
Sie können jetzt die Tasten "W", "A", "S", "D" oder die Pfeiltasten verwenden.
Schließlich im * Inspector * des Roller Agent
,
Aktivieren Sie das Kontrollkästchen * Heuristik verwenden * unter * Verhaltensparameter *.
Drücken Sie Play, um es auszuführen. Wenn Sie durch Tastatureingabe bestätigen können, dass es funktioniert, ist es erfolgreich.
Fahren wir nun mit dem Lernschritt fort.
Starten Sie zunächst Anaconda Prompt. Sie finden es sofort, indem Sie über das Startmenü (Win-Taste) suchen.
conda create -n ml-agents python=3.6
Geben Sie ein, um eine virtuelle Umgebung zu erstellen. [^ 1]
Proceed([y]/n)?
Sie werden gefragt, ob Sie es installieren möchten. Geben Sie also "y" ein. fortsetzen,
activate ml-agents
Geben Sie ein, um in die virtuelle Umgebung zu wechseln. [^ 2] Stellen Sie sicher, dass Sie die "(ml-Agenten)" am Anfang der Befehlszeile sehen.
cd <ml-Agentenordner >
Gehe zu. [^ 3]
pip install mlagents
Installieren Sie die Bibliothek, die ML-Agents unabhängig verwendet. (Es dauert ein paar Minuten) Diese Installation macht Abhängigkeiten wie TensorFlow / Jupyter.
Nach einer Weile, Es ist in Ordnung, wenn ein Bildschirm wie dieser angezeigt wird.
cd <ml-Agentenordner >\ml-agents-envs
Gehe zu.
pip install -e .
So installieren Sie das Paket. Es ist in Ordnung, wenn der Bildschirm so aussieht. Und
cd <ml-Agentenordner >\ml-agents
Gehe zu.
pip install -e .
So installieren Sie das Paket.
Damit ist die Vorbereitung auf der Python-Seite abgeschlossen.
__ : Kollision: [Hinweis]: Das TensorFlowSharp-Plug-In wird in Version 0.6.x oder höher nicht verwendet. __ Wenn Sie sich auf alte Bücher bezogen haben, empfehlen wir Ihnen, eine neue virtuelle Umgebung neu zu erstellen.
Bis ML-Agents Version 0.0.0 wurde TensorFlowSharp für die Kommunikation mit Python verwendet. Verwenden Sie es jedoch nicht in der neuesten Version. Wenn Sie es verwenden, tritt der folgende Fehler auf.
No model was present for the Brain 3DBallLearning. UnityEngine.Debug:LogError(Object) MLAgents.LearningBrain:DecideAction() (at Assets/ML-Agents/Scripts/LearningBrain.cs:191) MLAgents.Brain:BrainDecideAction() (at Assets/ML-Agents/Scripts/Brain.cs:80) MLAgents.Academy:EnvironmentStep() (at Assets/ML-Agents/Scripts/Academy.cs:601) MLAgents.Academy:FixedUpdate() (at Assets/ML-Agents/Scripts/Academy.cs:627)
Nun, endlich werden wir anfangen zu lernen. Das Traum-KI-Erlebnis steht vor der Tür. geben wir unser Bestes.
cd <ml-Agenten> Ordner
Geben Sie ein, um zur heruntergeladenen Ordnerhierarchie zu wechseln.
mlagents-learn config/trainer_config.yaml --run-id=firstRun --train
Ausführen. [^ 4] Am Ende der Befehlszeile, __INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor. (Gehen Sie zurück zum Unity-Editor und drücken Sie die Wiedergabetaste, um das Training zu starten.) __ Wird angezeigt.
Kehren Sie zum Unity-Bildschirm zurück und deaktivieren Sie * Use Heuristic * in __ * Behavior Parameters * und drücken Sie die Taste __ ,: arrow_forward :.
Als der Ball anfing, die Box zu jagen, begann das Lernen normal.
__ Wenn Sie die Wiedergabetaste eine Weile nicht drücken, tritt ein Timeout-Fehler auf. Führen Sie daher denselben Befehl erneut aus. __ __
Das Protokoll wird alle 1000 Schritte in das Konsolenprotokoll ausgegeben. Wenn Sie in der Mitte unterbrechen möchten, können Sie mit Strg + C unterbrechen. (Wenn Sie es wagen, früh fertig zu werden, können Sie eine "schwache KI" machen)
__Schritt ist die Anzahl der Versuche (Lernen), __ __Mittelbelohnung verdient durchschnittliche Belohnung, __ __Std der Belohnung ist die Standardabweichung __ (Wert, der die Datenvariation darstellt) Repräsentiert.
Nach dem Lernen wird eine RollerBallBrain.nn
-Datei unter <ml-agent-Ordner> \ models \ <id name ~>
erstellt.
Jetzt ist es Zeit, das Modell des erzeugten neuronalen Netzwerks zu testen.
Kopieren Sie die Datei "RollerBallBrain.nn" von früher in den Ordner "* Assets *" in Unitys Projekt. (Der Speicherort kann sich an einer beliebigen Stelle im Projekt befinden.)
Klicken Sie dann auf die Schaltfläche: radio_button: ganz rechts neben dem Element * Model * im * Inspector * des RollerAgent
und wählen Sie die importierte .nn
-Datei aus. (* Achten Sie zu diesem Zeitpunkt darauf, nicht zu verwechseln, wenn eine Erweiterungsdatei ".nn" mit demselben Namen vorhanden ist.)
Wenn * Heuristik verwenden * in * Verhaltensparameter * aktiviert bleibt, funktioniert dies nicht ordnungsgemäß. __ Deaktivieren Sie das Kontrollkästchen nach dem Test. __ __
Drücken wir nun: arrow_forward: Play.
__ Wenn der Ball Sie sicher verfolgt, sind Sie erfolgreich. __ __
Gehen Sie in Anaconda Prompt wie folgt vor:
tensorboard --logdir=summaries --port=6006
Wenn Sie [localhost: 6006](http: // localhost: 6006 /) in Ihrem Browser öffnen, sehen Sie den __ Lernübergang in einem Diagramm __.
――Wenn Sie mehr über Gorigori C # lesen können, können Sie den Algorithmus selbst optimieren. __
Selbst Anfänger können mithilfe von Ressourcen eine bequeme Welt schaffen, in der einfaches maschinelles Lernen an einem Tag nachgeahmt werden kann. Wie war es, als du es tatsächlich berührt hast? Ich hoffe, es wird Sie für maschinelles Lernen interessieren.
Wenn Sie Ausdrücke oder Tippfehler finden, an denen Sie interessiert sind, würden wir uns freuen, wenn Sie darauf hinweisen könnten. Auch wenn Sie diesen Artikel hilfreich fanden, gefällt es mir! Es wird Ermutigung sein, wenn du mir gibst.
Danke für Ihre Kooperation.
Nachfolgend finden Sie Artikel unserer Vorfahren, die beim Lernen sehr hilfreich waren. Ich möchte diese Gelegenheit nutzen, um __ Danke zu sagen __.
Offizielles Dokument von Unity-Technologies (GitHub) Migrationshandbuch für ml-Agenten (GitHub) [Einheit: Verwendung von ML-Agenten im September 2019 (Version 0.9.0 / 0.9.1/0.9.2)](https://www.fast-system.jp/unity-ml-agents-version-0- 9-0-wie zu /) [Unity] Ich habe ein Tutorial zum erweiterten Lernen ausprobiert (ML-Agents v0.8.1) [Erstellen Sie eine neue Lernumgebung mit den ML-Agenten von Unity (Version 0.6.0a)](http://am1tanaka.hatenablog.com/entry/2019/01/18/212915#%E5%AD%A6%E7 % BF% 92% E5% 8A% B9% E6% 9E% 9C% E3% 82% 92% E9% AB% 98% E3% 82% 81% E3% 82% 8B% E3% 81% 8A% E3% 81 % BE% E3% 81% 91)
[^ 1]: * Sie können den Teil von "ml-Agenten" * in einen beliebigen Namen ändern. [^ 2]: Aktivieren Sie mit dem von Ihnen festgelegten Namen der virtuellen Umgebung [^ 3]: Verzeichnis, in dem * ml-Agents-Master * in [Vorbereitung] heruntergeladen wurde (#Vorbereitung) [^ 4]: * Sie können den Teil von "firstRun" * in einen beliebigen Namen ändern.