Je n'ai pas trouvé l'article japonais de la v0.11.0, j'ai donc un mémorandum.
Cet article est __pour les débutants __. Les débutants Unity imitent l'un des didacticiels officiels de ML-Agents fais le Il fait partie du machine learning, __Reinforcement Learning __.
__ Je vais faire quelque chose comme ça. : arrow_up: __
C'est pour les personnes qui n'ont pas encore fait de machine learning, bien qu'elles sachent comment faire fonctionner Unity facilement. Plutôt que de nous concentrer sur la théorie, nous l'introduisons afin que vous puissiez en faire l'expérience tout en bougeant vos mains.
* Cet article est à jour en date du 13 novembre 2019. </ b> Les ML-Agents sont en cours de mise à niveau rapide, donc vérifiez toujours les dernières informations. ~~ [Livre publié l'année dernière](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-Agents% 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) n'a pas aidé ~~ (Au fait, la transition de cette année ⇒ 19 janvier: * v0.6 * ➡ avril: * v0.8 * ➡ octobre: * v0.10 * ➡ à partir de novembre: * v0.11 *)
Il existe quelques mots essentiels pour faire du machine learning dans Unity. C'est __ "Academy", "Brain" et "Agent" __.
Fondamentalement, "Brain" contrôle les actions entreprises par "Agent" dans l'environnement défini par "Academy" dans Unity. Cette fois, nous allons effectuer un apprentissage par renforcement via un TensorFlow externe (framework Python), charger le modèle de réseau neuronal généré dans Unity et l'exécuter. (Ceci est un tutoriel simple, donc je ne toucherai pas beaucoup à l'Académie.)
__ Si vous êtes nouveau dans ce domaine, vous pouvez l'ignorer. __ J'ai utilisé v0.8x et v0.9x, mais je ne suis pas sûr car je ne peux pas trouver les paramètres du cerveau, mais si vous regardez simplement ici, cela pourrait être bien.
Veuillez d'abord installer les éléments suivants.
Unity5 </ b> (je pense qu'il n'y a pas de problème si ver est migré vers 2017.4)
Anaconda 2019.10 </ b> (Veuillez sélectionner 3.7__ pour la version __Python)
ml-agents-master \ UnitySDK \ Assets
ML-Agents
dans votre projet.
Sol
Floor
Position = (0, 0, 0)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
À
-Jouez avec * Element * de * Inpector *> * Materials * pour le faire ressembler à vous.
Target
Position = (3, 0.5, 3)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
ÀFloor
, vous pouvez changer l'apparence à votre guise.
RollerAgent
Position = (0, 0.5, 0)
Rotation = (0, 0, 0)
Scale = (1, 1, 1)
À
――Comme auparavant, changez l'apparence à votre guise.
Si vous voulez qu'elle ressemble à une balle, choisissez le matériau CheckerSquare
.
-Ajouter * Rigidbody * à partir de * Ajouter un composant *.
Ensuite, je décrirai le contenu en C #.
-Avec ʻAcademysélectionné dans la fenêtre * Hierarchy *, utilisez * Add Component-> New Script * pour créer un script nommé
RollerAcademy.cs`.
RollerAcademy.cs
comme suit. Vous pouvez effacer le contenu original.RollerAcademy.cs
using MLAgents;
public class RollerAcademy : Academy{ }
Dans cette description, Les fonctions de base telles que «observation-décision-action» (omises ici) sont héritées de la classe * Academy * vers la classe * RollerAcademy *. Donc ça va avec deux lignes.
Sélectionnez RollerAgent
dans la fenêtre * Hierarchy * et sélectionnez
Créez un script nommé RollerAgent.cs
avec * Ajouter un composant-> Nouveau script *.
Réécrivez le contenu de RollerAgent.cs
comme suit.
RollerAgent.cs
using MLAgents;
public class RollerAgent : Agent{ }
Comme * Academy *, il lit l'espace de noms * MLAgents * et spécifie * Agent * comme classe de base à hériter.
C'est la procédure de base pour incorporer des agents ML dans __Unity. Ensuite, nous ajouterons un mécanisme pour que la balle se précipite vers la boîte en renforçant l'apprentissage.
Réécrivez le contenu de RollerAgent.cs
comme suit.
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)
{
//Accélération rotationnelle et réinitialisation de l'accélération
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
//Renvoyer l'agent à sa position initiale
this.transform.position = new Vector3( 0, 0.5f, 0)
}
//Relocalisation cible
Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
Random.value * 8 - 4);
}
}
ici,
--Suivant __ relocalisation et initialisation __ lorsque RollerAgent
atteint la boîte ( Target
)
--__ Retour __ lorsque RollerAgent
tombe du sol ( Floor
)
Est en cours de traitement.
Rigidbody
est un composant utilisé dans la simulation physique d'Unity.
Cette fois, il sera utilisé pour exécuter l'agent.
Les valeurs de * Position, Rotation, Scale * sont enregistrées dans Transform
.
En le définissant dans public
, * Inpector * peut passer Transform
de * Target *.
Ajoutez ce qui suit dans la classe de RollerAgent.cs
.
public override void CollectObservations()
{
//Emplacement de la cible et de l'agent
AddVectorObs(Target.position);
AddvectorObs(This.transform.position);
//Vitesse de l'agent
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
}
ici, __ Traitement pour collecter les données observées en tant que vecteur caractéristique __ Je fais.
Les coordonnées 3D de * Target * et * Agent * et les vecteurs 8D totaux de * Agent * speed * x * et * z * sont transmises au réseau neuronal. ~~ La 8ème dimension est cool ~~
Ajoutez le traitement suivant lié à la fonction ʻAgentAction () à
RollerAgent.cs`.
public float speed = 10
public override void AgentAction(float[] vectorAction, string textAction)
{
//action
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0];
controlSignal.z = vectorAction[1];
rBody.AddForce(controlSignal * speed);
//Récompense
//Obtenez la distance de la boîte (cible) à partir de la distance de déplacement de la balle (agent)
float distanceToTarget = Vector3.Distance(this.transform.position,
Target.position);
//Lorsque la case (cible) est atteinte
if (distanceToTarget < 1.42f)
{
//Récompensé et terminé
SetReward(1.0f);
Done();
}
//Si tu tombes du sol
if (this.transform.position.y < 0)
{
Done();
}
}
ici, __L'action de lire les deux types de forces (valeurs continues) appliquées dans les directions X et Z et d'essayer de déplacer l'agent Nous traitons un algorithme d'apprentissage qui donne une «récompense» lorsque l'agent atteint avec succès la boîte et récupère la «récompense» lorsqu'elle tombe.
La fonction ʻAddForce` est une fonction pour appliquer une force physique à un objet avec un composant * Rigidbody * et le déplacer. Ce n'est que lorsque la distance inférieure à la valeur de référence pour juger si l'objectif a été atteint est calculée, la récompense est donnée et la réinitialisation est effectuée.
Afin d'obtenir suffisamment d'apprentissage dans des situations plus compliquées, il est efficace d'écrire non seulement la récompense mais aussi la punition. ~~ (En v0,5x, c'était -1
quand il est tombé du sol, mais il semble que cela ait été jugé inutile dans la dernière version) ~~
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)
{
//Accélération rotationnelle et réinitialisation de l'accélération
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
//Renvoyer l'agent à sa position initiale
this.transform.position = new Vector3( 0, 0.5f, 0)
}
//Relocalisation cible
Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
Random.value * 8 - 4);
}
public override void CollectObservations()
{
//Emplacement de la cible et de l'agent
AddVectorObs(Target.position);
AddvectorObs(This.transform.position);
//Vitesse de l'agent
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
}
public override void AgentAction(float[] vectorAction, string textAction)
{
//action
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0];
controlSignal.z = vectorAction[1];
rBody.AddForce(controlSignal * speed);
//Récompense
//Obtenez la distance de la boîte (cible) à partir de la distance de déplacement de la balle (agent)
float distanceToTarget = Vector3.Distance(this.transform.position,
Target.position);
//Lorsque la case (cible) est atteinte
if (distanceToTarget < 1.42f)
{
//Récompensé et terminé
SetReward(1.0f);
Done();
}
//Si tu tombes du sol
if (this.transform.position.y < 0)
{
Done();
}
}
}
-Sélectionnez RollerAgent
dans la fenêtre * Hierarchy * et modifiez l'élémentRollerAgent (Script) de deux points.
Decision Interval = 10
Target = Target(Transform)`
-Ajouter * Ajouter un composant> Paramètres de comportement * et modifier les paramètres comme suit.
Behavior Name = RollerBallBrain
Vector Observation Space Size = 8
Vector Action Space Type = Continuous
Vector Action Space Size = 2
Aussi, selon la documentation officielle (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md), si vous continuez à utiliser les paramètres par défaut 30 Il semble qu'il faut du temps pour apprendre 10 000 pas. Cette fois, ce n'est pas si compliqué, alors réécrivons certains des paramètres pour réduire le nombre d'essais à moins de 20 000 étapes.
-Ouvrez trainer_config.yaml
dans * ml-agents-master-0.11> config> * avec un éditeur (VS code ou Notepad) et réécrivez les valeurs des éléments suivants.
batch_size: 10
buffer_size: 100
Vous êtes maintenant prêt à vous entraîner.
Il est presque temps d'arriver ici.
Avant de renforcer l'apprentissage, vérifions manuellement si l'environnement créé jusqu'à présent fonctionne correctement.
Implémentez la méthode suivante en plus dans la classe de RollerAgent.cs
.
public override float[] Heuristic()
{
var action = new float[2];
action[0] = Input.GetAxis("Horizontal");
action[1] = Input.GetAxis("Vertical");
return action;
}
Axe d'entrée horizontal (horizontal) avec "Horizontal", Permet à «Vertical» d'accepter les axes d'entrée verticaux (verticaux).
Vous pouvez maintenant utiliser les touches "W", "A", "S", "D" ou flèches.
Enfin, dans * l'Inspecteur * de Roller Agent
,
Cochez la case * Use Heuristic * sous * Behavior Parameters *.
Appuyez sur Lecture pour l'exécuter. Si vous pouvez confirmer que cela fonctionne par entrée de clé, cela réussit.
Maintenant, passons à l'étape d'apprentissage.
Tout d'abord, lancez Anaconda Prompt. Vous pouvez le trouver immédiatement en effectuant une recherche dans le menu Démarrer (touche Win).
conda create -n ml-agents python=3.6
Entrez pour créer un environnement virtuel. [^ 1]
Proceed([y]/n)?
Il vous sera demandé si vous souhaitez l'installer, alors entrez y
. continuer,
activate ml-agents
Entrez pour passer à l'environnement virtuel. [^ 2]
Assurez-vous que vous voyez le (ml-agents)
au début de la ligne de commande.
cd <ml-dossier de l'agent >
Aller à. [^ 3]
pip install mlagents
Installez la bibliothèque que ML-Agents utilise indépendamment. (Cela prend quelques minutes) Cette installation crée des dépendances telles que TensorFlow / Jupyter.
Après un moment, C'est OK si un écran comme celui-ci apparaît.
cd <ml-dossier agents >\ml-agents-envs
Aller à.
pip install -e .
Pour installer le package. Ce n'est pas grave si l'écran ressemble à ceci. Et
cd <ml-dossier agents >\ml-agents
Aller à.
pip install -e .
Pour installer le package.
Ceci termine la préparation côté Python.
__ : collision: [Remarque]: le plug-in TensorFlowSharp n'est pas utilisé dans la version 0.6.x ou ultérieure. __ Si vous avez fait référence à d'anciens livres, nous vous recommandons de recréer un nouvel environnement virtuel.
Jusqu'à ML-Agents ver0.5.0, TensorFlowSharp était utilisé pour communiquer avec Python, mais veuillez ne pas l'utiliser dans la dernière version. Si vous l'utilisez, l'erreur suivante se produira.
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)
Enfin, nous allons commencer à apprendre. L'expérience IA de rêve approche à grands pas. faisons de notre mieux.
cd <ml-agents> dossier
Entrez pour passer à la hiérarchie des dossiers téléchargés.
mlagents-learn config/trainer_config.yaml --run-id=firstRun --train
Éxécuter. [^ 4] Au bas de la ligne de commande, __INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor. (Revenez à l'éditeur Unity et appuyez sur le bouton Lecture pour démarrer l'entraînement.) __ Est affiché.
Revenez à l'écran Unity et décochez * Use Heuristic * dans __ * Behavior Parameters * et appuyez sur le bouton __ ,: arrow_forward:.
Lorsque la balle a commencé à chasser la boîte, l'apprentissage a commencé normalement.
__ Si vous n'appuyez pas sur le bouton Lecture pendant un certain temps, une erreur de temporisation se produira, veuillez donc réexécuter la même commande. __
Le journal est sorti dans le journal de la console toutes les 1000 étapes. Si vous souhaitez interrompre au milieu, vous pouvez interrompre avec Ctrl + C. (Si vous osez finir tôt, vous pouvez faire une "IA faible")
__Step est le nombre d'essais (apprentissage), __ __Mean Reward gagné en moyenne, __ __Std of Reward est l'écart type __ (valeur représentant la variation des données) Représente.
Après l'apprentissage, un fichier RollerBallBrain.nn
sera créé sous <dossier ml-agents> \ models \ <id name ~>
.
Il est maintenant temps de tester le modèle du réseau neuronal généré.
Copiez le fichier RollerBallBrain.nn
antérieur dans le dossier * Assets * du projet Unity.
(L'emplacement peut être n'importe où dans le projet)
Cliquez ensuite sur le bouton: radio_button: à l'extrême droite de l'élément * Model * dans * Inspector * du RollerAgent
et sélectionnez le fichier importé .nn
. (* À ce stade, veillez à ne pas confondre s'il existe un fichier d'extension .nn
avec le même nom.)
De plus, si * Use Heuristic * dans * Behavior Parameters * est laissé coché, cela ne fonctionnera pas correctement. __ Assurez-vous de le décocher après le test. __
Maintenant, appuyons sur: arrow_forward: Play.
__ Si la balle commence à vous poursuivre en toute sécurité, vous réussissez. __
Dans Anaconda Prompt, procédez comme suit:
tensorboard --logdir=summaries --port=6006
Si vous ouvrez [localhost: 6006](http: // localhost: 6006 /) dans votre navigateur, vous pouvez voir la transition d'apprentissage __ dans un graphique __.
――Si vous pouvez lire plus Gorigori C #, vous pourrez affiner l'algorithme vous-même __
Même les débutants peuvent utiliser des ressources pour créer un monde pratique où l'apprentissage automatique simple peut être imité en une journée. Comment était-ce quand vous l'avez réellement touché? J'espère que ce sera une opportunité pour vous de vous intéresser à l'apprentissage automatique.
Si vous trouvez des expressions ou des erreurs typographiques qui vous intéressent, nous vous serions reconnaissants de bien vouloir les signaler. Aussi, si vous avez trouvé cet article utile, je l'aime bien __! Ce sera __encouragement si vous me donnez.
Merci de votre collaboration.
Vous trouverez ci-dessous des articles de nos ancêtres qui ont été très utiles dans l'apprentissage. Je voudrais profiter de cette occasion pour vous dire __merci __.
Document officiel Unity-Technologies (GitHub) Guide de migration ml-agents (GitHub) [Unity: Comment utiliser ML-Agents en septembre 2019 (ver0.9.0 /0.9.1/0.9.2)](https://www.fast-system.jp/unity-ml-agents-version-0- 9-0-comment /) [Unity] J'ai essayé un tutoriel sur l'apprentissage amélioré (ML-Agents v0.8.1) [Créez un nouvel environnement d'apprentissage avec les agents ML d'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]: * Vous pouvez changer la partie de "ml-agents" * en n'importe quel nom que vous voulez. [^ 2]: activer avec le nom d'environnement virtuel que vous avez défini [^ 3]: Répertoire où * ml-agents-master * a été téléchargé dans Préparation [^ 4]: * Vous pouvez changer la partie de "firstRun" * en n'importe quel nom de votre choix.