Una introducción a la ML-Agentes de la Unidad – GameDev Academia

Tabla de contenidos

Introducción

Está bien. Así que eres un entusiasta de la informática en ciernes y que está tratando de hacer una IA que tendrá el mundo. Hacer su investigación y averiguar acerca de esta cosa llamada “aprendizaje automático.” Usted ha visto varias demostraciones impresionantes de tecnología de aprendizaje automático por lo que decide que esta es la herramienta que está buscando. A hacer más investigaciones sobre cómo crear un agente de aprendizaje automático que inevitablemente le lleva aquí.

Bueno, mi amigo, usted ha venido al lugar correcto. Por desgracia, la IA que va a ser la construcción en este tutorial es muy lejos de la “tierra que domina” AI que tiene en mente. Sin embargo, el conocimiento encontrar aquí le ayudará a construir juegos y aplicaciones interesantes.

A través de las instrucciones a continuación, vamos a estar haciendo una IA mucho más dócil que aprender a equilibrar un cuerpo rígido virtual. Vamos a utilizar la plataforma ML-Agentes de la Unidad de configurar y capacitar a nuestra red neuronal (es decir, los algoritmos o “cerebro” de nuestro sistema). Vamos a ir a través de cómo instalar ML-Agentes de trabajo con el Editor de la Unidad -. E incluso cómo podemos guardar la red neuronal generada a nuestro proyecto

Así que, aunque no es nada parecido a esclavizar a la humanidad, si está listo para descubrir el papel de la máquina de aprendizaje en el desarrollo de juegos y aplicaciones, sentarse y estar listo aprender cómo usar ML-Agents.
No se pierda! extremos de la oferta en

  • Accede a los más de 200 cursos
  • Nuevos cursos añadió mensual
  • Cancelar en cualquier momento
  • Los certificados de terminación

    ACCESO ahora

    ¿Qué es ML-Agents?

    Unidad de LD-Agents es un marco de aprendizaje automático integrado en el editor de Unity que utiliza Python y TensorFlow (una biblioteca matemática de código abierto). Es capaz de Aprendizaje supervisado, no supervisado de aprendizaje, y el aprendizaje de refuerzo. aprendizaje por refuerzo es lo que más se piensa cuando se trata de aprendizaje automático. Un agente está capacitado para generar una política (básicamente un conjunto de instrucciones) tomando en Observaciones y la realización de acciones . Esta política diseñada para maximizar el número de premia que la realización de las acciones los rendimientos.

    ML-Agents tiene cinco componentes principales, cuatro de los cuales vamos a utilizar. Ellos son los Medio ambiente Formación , API Python de bajo nivel , comunicador externo, entrenador Python, y Gimnasio Envoltura (no vamos a utilizar esta cantidad). La Formación Medio Ambiente es la escena hemos creado en el editor de la Unidad. Aquí es donde los agentes observan y realizan acciones. La Python bajo nivel API es una herramienta externa que manipula la máquina de aprendizaje “cerebro” durante el entrenamiento. Los comunicador externo se comunica con el Python bajo nivel API y ambiente de aprendizaje. Python Trainer en la vida Python bajo nivel API y ejecuta todos los algoritmos que participan en la formación. La Gimnasio Envoltura es un componente adaptado para el aprendizaje de la máquina investigadores por lo que no vamos a utilizar que en este proyecto.

    Debido a que este es un tutorial sobre cómo paquete de aprendizaje automático de la unidad, esto no es un tutorial sobre el aprendizaje de las máquinas en general. Para ello, echa un vistazo a la máquina de aprendizaje del Mini-grado en Zenva Academia. Le recomiendo que aprenda acerca de cómo aprender realmente funciona la máquina (suponiendo que no lo hace ya). Es un campo muy interesante y rápida evolución de la informática.

    archivos de proyecto e instalación

    El proyecto terminado para este tutorial se puede descargar aquí:. Código fuente

    Este proyecto se basa en un ejemplo proporcionado por la Unidad. Si desea probar este ejemplo, o algunas otras demostraciones fresco, Unity Technologies ha creado un Github con todos los proyectos (ML Agentes de GitHub). La unidad de LD-Agentes pueden ser importados desde el gestor de paquetes. Ir a la ventana -> Gestor de paquetes y asegúrese de que está viendo todos los paquetes. Descargar e importación ML-Agents.

    Abrir el gestor de paquetes

    gestor de paquete importación de agentes ml

    A continuación, vas a querer instalar Python 3.6 o posterior. Ir a https://www.python.org/downloads/ y descargar el paquete de 64 bits para su sistema operativo. Es debe ser de 64 bits o usted no será capaz de instalar ML-Agents. Una vez instalado Python, abra una ventana de línea de comandos y ejecute este comando:
    PIP3 instalar mlagents

    Esto instalará Tensorflow y todos los demás componentes que intervienen en la ML-Agents.

    Esta no es la única vez que va a utilizar la ventana de línea de comandos. Vaya por delante y mantenerla abierta mientras trabajamos a través de nuestro proyecto.

    Visión General del Proyecto

    Observaciones

    Al acercarse a cualquier proyecto de aprendizaje de máquina, es una buena idea tener algún tipo de plan de asignación para las recompensas y observaciones. ¿Qué tipo de observaciones es el agente va a tomar en? ¿Qué tipo de recompensas vamos a darle para realizar ciertas acciones? Ahora, para un proyecto de aprendizaje de máquina que está haciendo desde cero, a menudo tendrá que ser ajustado su plan de asignación original. Afortunadamente, usted está siguiendo, junto con un tutorial por lo que ya he encontrado el plan correcto para la toma de observaciones y el establecimiento de recompensas. En primer lugar, el “agente” en nuestro proyecto es lo que está tratando de equilibrar la bola (esto podría ser un avión o un cubo). Hay tres observaciones clave necesita este agente. La primera es la velocidad de la pelota que está tratando de equilibrar. El segundo es la rotación de la bola en los ejes X y Z (que no necesitamos el eje Y). Por último, se necesita la posición de la bola.

    Gráfico explicar las observaciones (velocidad, posición y rotación)

    Lo bueno de este proyecto es que podemos entrenar la red neuronal para utilizar un avión o un cubo. Voy a estar usando un cubo largo de este proyecto pero no dude en hacer algunos experimentos.

    Rewards

    En cuanto a los premios, hay dos formas principales que van a ser manipularlos. La primera y más obvia es cuando el agente de gotas de la esfera. Vamos a darle una recompensa de -1. Sin embargo, cuando el agente continúa para mantener la esfera, vamos a darle una muy pequeña recompensa cada cálculo (un valor de aproximadamente 0,01). De esta manera, el agente será recompensado por cuánto tiempo se mantiene la pelota y castigado si la pelota cae. La idea de la formación de la red neuronal, entonces, es enseñar a conseguir el máximo número de recompensas.

    Configuración del entorno y el Agente

    Configuración de los elementos reales en la escena es bastante simple. Necesitamos un cubo y una esfera, tanto a escala a un tamaño razonable.

    Escala del cubo en Untiy

    escala de la bola en la unidad

    No necesita preocuparse acerca de los tamaños exactos ya que la red neuronal se entrenará a pesar de todo. Asignar un cuerpo rígido a la Esfera.

    Crear un objeto de juego vacío llamado “AgentContainer” y colocar la esfera y el cubo como objetos secundarios.

    contenedor de agente con el cubo y la esfera

    La razón por la que esto se hará evidente cuando comenzamos el agente de secuencias de comandos.

    Hablando de eso, vamos a asignar todos los componentes necesarios para nuestro agente. Crear una carpeta llamada “Scripts” y crear una nueva secuencia de comandos de C # llamado “BalllBalanceAgent.”



    Asignar esto a nuestro Agente Cubo y luego abrirlo en un editor de texto.


    Lo primero que hay que hacer para este script es para asegurarse de que está utilizando “UnityEngine.MLAgents” y “UnityEngine.MLAgents.Sensors.”
    utilizando UnityEngine; usando Unity.MLAgents; utilizando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: MonoBehaviour {// inicio se llama antes de la primera actualización del marco vacío Inicio () {} // actualización se llama una vez por cuadro de actualización de vacío () { }} 123456789101112131415161718usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: MonoBehaviour {// inicio se llama antes de la primera updatevoidStart marco () {} // actualización se llama una vez por framevoidUpdate () {}}

    a continuación, podemos eliminarla heredando de MonoBehaviour y hacer que heredan de “agente”.
    utilizando UnityEngine; usando Unity.MLAgents; utilizando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: Agente {// inicio se llama antes de la primera actualización del marco vacío Inicio () {} // actualización se llama una vez por cuadro de actualización de vacío () { }} 123456789101112131415161718usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agente {// inicio se llama antes de que el primer cuadro updatevoidStart () {} // actualización se llama una vez por framevoidUpdate () {}}

    Este es super importante y está en el corazón de secuencias de comandos ML-Agents. Si usted tiene un vistazo a su agente en el Editor de la Unidad, podrás ver que el “BallBalanceAgent” se ha dado un control deslizante “MaxStep”. En esencia, este es el tiempo que un episodio agente va a durar. Un “episodio” es un período de tiempo en el que el agente puede ganar recompensas y realizar acciones. Por ejemplo, si la pelota cae del cubo, nos gustaría que todo para restablecer lo que el agente puede volver a intentarlo. Dándole un valor entero le dirá al agente de cuánto tiempo de “hacer cosas” en la escena hasta que todo se reinicia y los intentos de agente de nuevo. Un valor de cero significa un número infinito de pasos que significa una cantidad infinita de tiempo. Vamos a estar empezando y terminando el episodio manualmente por lo que necesitamos este conjunto a cero.

    Mientras estamos en el Editor de la Unidad, hay un par de otros componentes necesita este agente. El primero es un “Solicitante Decisión.”


    Una decisión Solicitante hace lo que su nombre indica, se solicita una decisión que debe tomarse en base a las observaciones realizadas. El “Período de Decisión” determina el número de pasos de la Academia deben tener lugar antes de que se solicite una decisión. Pero lo que es un “paso Academia” y lo que aún es la “Academia?” Vamos a ver cada uno de estos con más detalle, pero por ahora, la academia es básicamente un conjunto unitario “cerebro” global que funciona básicamente todo en ML-Agents. Un paso Academia es básicamente un período de tiempo que la Academia utiliza durante el entrenamiento. El valor actual del 5 debería ser suficiente para nuestro proyecto.

    El siguiente componente de nuestro agente necesita es un script “Comportamiento Parámetros”.


    Esto determina cuantas observaciones que estamos tomando y qué tipo de forma de las acciones emitidas tomará. Vamos a jugar con esto más a medida que comenzamos nuestro agente de secuencias de comandos. Así que vuelve a su script BallBalanceAgent y eliminar los métodos Start y Actualizar para estar listo para la escritura de esta cosa.
    utilizando UnityEngine; usando Unity.MLAgents; utilizando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: {} Agente 12345678usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agente {}

    Secuencias de comandos del Agente

    Descripción y configuración

    El resumen Agente contiene cinco definiciones de los métodos que vamos a anulación. Son “CollectObservations”, “Inicializar”, “OnActionReceived”, “heurística”, y “OnEpisodeBegin.”
    utilizando UnityEngine; usando Unity.MLAgents; utilizando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: Agente {public override void Initialize () {base.Initialize (); } Public override void CollectObservations (VectorSensor sensor) {base.CollectObservations (sensor); } Void public override OnActionReceived (float [] vectorAction) {base.OnActionReceived (vectorAction); } Public override void heurístico (float [] actionsOut) {base.Heuristic (actionsOut); } Public override OnEpisodeBegin void () {base.OnEpisodeBegin (); }} 12345678910111213141516171819202122232425262728293031usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agente {publicoverridevoidInitialize () {base.Initialize ();} publicoverridevoidCollectObservations (sensor VectorSensor) {base.CollectObservations (sensor);} publicoverridevoidOnActionReceived (float [] vectorAction) {base.OnActionReceived (vectorAction);} publicoverridevoidHeuristic (float [] actionsOut) {base.Heuristic (actionsOut);} publicoverridevoidOnEpisodeBegin () {base.OnEpisodeBegin ();}}

    funciones “Inicializar” similares a la “Inicio” método que no sea lo que se llama un poco antes de lo “Inicio”. “CollectObservations” es donde enviamos observaciones a la Academia y “OnActionReceived” es donde obtenemos una acción de la academia. “OnEpisodeBegin” se llama cada vez que se inicia un nuevo episodio (como su nombre lo indica). Esto deja “heurísticos” como el único método sin una explicación. Para entender lo que “heurístico” es, volver al Editor de la Unidad y echar un vistazo a los parámetros de comportamiento del agente.


    Como se puede ver, “Tipo de comportamiento” tiene tres opciones, “Sólo heurístico”, “por defecto”, y “única inferencia”. Cuando se establece en defecto, si una red neuronal que se ha generado, el agente se ejecutará “Inferencia Sólo”, ya que utiliza la red neuronal para tomar decisiones. Cuando no se proporciona ninguna red neuronal, se utilizará “Sólo heurístico.” El método heurístico puede ser pensado como el enfoque tradicional de la IA, donde un programador entradas de todos los posibles comandos directamente sobre el objeto. Cuando se establece en “Sólo heurístico,” el agente se ejecutará lo que está en el método heurístico. Seguir adelante y poner estas pocas líneas de código en el método heurístico:
    override public void heurístico (float [] actionsOut) {actionsOut [0] = -Input.GetAxis ( «horizontal»); actionsOut [1] = Input.GetAxis ( «vertical»); } 12345publicoverridevoidHeuristic (float [] actionsOut) {actionsOut [0] = – Input.GetAxis ( «horizontal»); actionsOut [1] = Input.GetAxis ( «vertical»);}

    salto atrás Vamos en el guión y BallBalanceAgent establecer las variables que van a necesitar para su uso. Vamos a necesitar acceso tanto a la posición y la velocidad de la pelota. Cree dos variables, una de ellas pública otra privada. Uno de ellos de tipo GameObject y uno de tipo de cuerpo rígido.
    utilizando UnityEngine; usando Unity.MLAgents; usando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: Agente {bola GameObject pública; ballRigidbody cuerpo rígido; override public void Initialize () {base.Initialize (); } Public override void CollectObservations (VectorSensor sensor) {base.CollectObservations (sensor); } Void public override OnActionReceived (float [] vectorAction) {base.OnActionReceived (vectorAction); } Public override void heurístico (float [] actionsOut) {base.Heuristic (actionsOut); } Public override OnEpisodeBegin void () {base.OnEpisodeBegin (); }} 12345678910111213141516171819202122232425262728293031323334usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agent {balón publicGameObject; cuerpo rígido ballRigidbody; publicoverridevoidInitialize () {base.Initialize ();} publicoverridevoidCollectObservations (sensor VectorSensor) {base.CollectObservations (sensor);} publicoverridevoidOnActionReceived (float [] vectorAction) {base.OnActionReceived (vectorAction);} publicoverridevoidHeuristic (float [] actionsOut) {base.Heuristic (actionsOut);} publicoverridevoidOnEpisodeBegin () {base.OnEpisodeBegin ();}}

    A continuación,’ re va a acceder necesidad de un conjunto de datos en la Academia llamada “EnvironmentParameters.” Vamos a utilizar estos para establecer y obtener el tamaño predeterminado de la pelota.
    utilizando UnityEngine; usando Unity.MLAgents; usando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: Agente {bola GameObject pública; ballRigidbody cuerpo rígido; EnvironmentParameters DefaultParameters; 123456789usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agente {publicGameObject pelota; ballRigidbody cuerpo rígido; EnvironmentParameters DefaultParameters;

    La variable “bola” se asignarán en el inspector pero todavía necesitan para asignar “ballRigidbody ”y‘DefaultParameters’. Hacemos esto en el método de “inicialización” de esta manera:
    utilizando UnityEngine; usando Unity.MLAgents; usando Unity.MLAgents.Sensors; BallBalanceAgent clase pública: Agente {bola GameObject pública; ballRigidbody cuerpo rígido; DefaultParameters EnvironmentParameters; override public void Initialize () {ballRigidbody = ball.GetComponent (); DefaultParameters = Academy.Instance.EnvironmentParameters; } 123456789101112131415usingUnityEngine; usingUnity.MLAgents; usingUnity.MLAgents.Sensors; publicclassBallBalanceAgent: Agent {balón publicGameObject; cuerpo rígido ballRigidbody; EnvironmentParameters DefaultParameters; publicoverridevoidInitialize () {ballRigidbody = ball.GetComponent (); DefaultParameters = Academy.Instance.EnvironmentParameters;}

    Ahora, hemos establecido las variables que van a necesitar, vamos a empezar a tomar en las observaciones y el establecimiento de acciones.

    Tomando Observaciones y configuración de acciones

    Ya sabemos lo que las observaciones de las necesidades del agente así que todo lo que necesitamos es la sintaxis. En el método “CollectObservations”, escriba lo siguiente:
    public override void CollectObservations (VectorSensor sensor) {sensor.AddObservation (ballRigidbody.velocity); } 1234publicoverridevoidCollectObservations (sensor VectorSensor) {sensor.AddObservation (ballRigidbody.velocity);}

    Lo que hemos hecho es contada la Academia de observar los valores de esta vector3. Vamos a seguir viendo todas estas cosas la Academia hace. Aquí, la Academia está recogiendo esencialmente tres flotadores y enviarlos a Python y Tensorflow. Sólo por el bien de la información, hay varias otras maneras de tomar en las observaciones que no utilizan este método. Este método se conoce como “arbitraria vector de observación.” También hay que señalar que un “vector” en contextos de aprendizaje automático se limita a flotar medios apilados juntos. Es un poco diferente que la comprensión Unidad convencional de vectores.

    Pero esto no es todo las observaciones que tenemos que hacer. También tenemos que añadir la posición de la pelota y la rotación del agente cubo.
    public override void CollectObservations (VectorSensor sensor) {sensor.AddObservation (ballRigidbody.velocity); sensor.AddObservation (ball.transform.position); sensor.AddObservation (transform.rotation.z); sensor.AddObservation (transform.rotation.x); } 1234567publicoverridevoidCollectObservations (VectorSensor sensor) {sensor.AddObservation (ballRigidbody.velocity); sensor.AddObservation (ball.transform.position); sensor.AddObservation (transform.rotation.z); sensor.AddObservation (transform.rotation.x);}

    Ahora pulse Guardar y saltar por encima al componente Comportamiento de parámetros y echar un vistazo a la “vector de observación” y “Tamaño de espacio.”


    tiene que asegurarse de que el tamaño del espacio de observación coincide con nuestro código. Lo que se pregunta, en esencia es la cantidad de entradas flotador está tomando en el agente? Si se suman todos los vectores en el método CollectObservations, vemos que estamos observando ocho valores de coma flotante (2 Vector3s y 2 valores de rotación). Establecer el tamaño del espacio a 8.


    El control deslizante “StackedVectors” le permite establecer el número de vectores debe ser observada antes de ser enviada a la Academia. Para nuestro proyecto, esto no debería ser superior a 1.

    Ahora tenemos que configurar lo que vamos a hacer con lo que la red neuronal escupe. En primer lugar, es necesario determinar si debemos tener un espacio de acción “continua” o “discreto”. A continuos espetones espacio de acción fuera un valor que va desde -1 a 1. Un discretas espetones espacio de acción fuera un valor entero. Para nuestro proyecto, que es bastante obvio lo que necesitamos. Ajuste el “Espacio Tipo” en el componente de parámetros de comportamiento de “continua”.


    A continuación, es necesario determinar el número de acciones que debemos exigir a la red neuronal. En nuestro caso, queremos que la red neuronal para controlar la X y Z rotación de nuestro agente. A fin de establecer el “tamaño del espacio” a 2.


    Ahora podemos saltar de nuevo en el guión BallBalanceAgent y trabajar en las acciones de los agentes. Hay un par de diferentes enfoques para este proyecto. La forma en que vamos a enfocarlo es establecer la rotación del agente igual a una variable especial. Esto duplica variables cualquier acción que se recibe de la red neuronal. Pero sólo vamos a establecer la rotación del agente si el agente no se gira demasiado lejos. Esto asegura que no hay nada raro mover de un tirón. Como he mencionado anteriormente, si está trabajando en este proyecto desde cero, este enfoque no es probablemente lo que usted va a elegir la derecha del palo Afortunadamente, usted está trabajando a través de un tutorial que “conoce todas las respuestas”, por así hablar.

    En el “OnActionsRecieved” método, escribir las siguientes líneas de código:
    override public void OnActionReceived (float [] vectorAction) {var Zangle = 2f * Mathf.Clamp (vectorAction [0], -1 septies, 1f); var xangle = 2f * Mathf.Clamp (vectorAction [1], -1 septies, 1f); if ((gameObject.transform.rotation.z <0.25f && Zangle> 0f) || (gameObject.transform.rotation.z> -0.25f && Zangle <0f)) {gameObject.transform.Rotate (nueva Vector3 (0, 0, 1), Zangle); } If ((gameObject.transform.rotation.x <0.25f && xangle> 0f) || (gameObject.transform.rotation.x> -0.25f && xangle <0f)) {gameObject.transform.Rotate (nueva Vector3 (1 , 0, 0), xangle); }} 1234567891011121314151617publicoverridevoidOnActionReceived (float [] vectorAction) {varzangle = 2f * Mathf.Clamp (vectorAction [0], - 1f, 1f); varxangle = 2f * Mathf.Clamp (vectorAction [1], - 1f, 1f), si ( (gameObject.transform.rotation.z <0.25f && Zangle> 0f) || (gameObject.transform.rotation.z> -0.25f && Zangle <0f)) {gameObject.transform.Rotate (nuevo Vector3 (0, 0, 1 ), Zangle);} if ((gameObject.transform.rotation.x <0.25f && xangle> 0f) || (gameObject.transform.rotation.x> -0.25f && xangle <0f)) {gameObject.transform.Rotate ( nueva Vector3 (1, 0, 0), xangle);.}}

    Como se puede ver, sólo estamos diciendo que gire si no ha girado más de 25 grados en cualquier dirección en cualquiera de los ejes

    Configuración de recompensas y Agentes de reinicialización

    Ahora necesitamos recompensas asignar al agente. De acuerdo con nuestro plan, nos vamos a dar al agente una pequeña recompensa por mantener la pelota hacia arriba. También nos vamos a darle una recompensa -1 si la pelota cae. También tenemos que terminar el episodio y reinicio si la pelota cae. Vamos a empezar con la segunda. Crear un nuevo método llamado “ResetScene” y poner el siguiente código en él:
    void ResetScene () {ballRigidbody.mass = defaultParameters.GetWithDefault ( «masa», 1.0f); escala var = defaultParameters.GetWithDefault ( «escala», 1.0f); ball.transform.localScale = nuevo Vector3 (escala, la escala, la escala); } 123456voidResetScene () {ballRigidbody.mass = defaultParameters.GetWithDefault ( «masa», 1.0f); varscale = defaultParameters.GetWithDefault ( «escala», 1.0f); ball.transform.localScale = newVector3 (escala, la escala, la escala); }

    Esto establece la masa y la escala de la pelota a su tamaño predeterminado. Aviso, se está haciendo el valor de los parámetros del entorno de la Academia.

    A continuación, tenemos que hacer un poco más de restablecer en el método “OnEpisodeBegin”. Tenemos que restablecer la posición y la velocidad de la pelota, la rotación del agente, y por qué no aleatoria que cada episodio?
    public override OnEpisodeBegin void () {gameObject.transform.rotation = new Quaternion (0f, 0f, 0f, 0f); gameObject.transform.Rotate (nuevo Vector3 (1, 0, 0), Random.Range (-10F, 10f)); gameObject.transform.Rotate (nuevo Vector3 (0, 0, 1), Random.Range (-10F, 10f)); ballRigidbody.velocity = nuevo Vector3 (0F, 0f, 0f); ball.transform.position = new Vector3 (Random.Range (-1.5f, 1.5f), 4f, Random.Range (-1.5f, 1.5f)) + gameObject.transform.position; ResetScene (); } Void ResetScene () {ballRigidbody.mass = defaultParameters.GetWithDefault ( «masa», 1.0f); escala var = defaultParameters.GetWithDefault ( «escala», 0.5f); ball.transform.localScale = nuevo Vector3 (escala, la escala, la escala); } 1234567891011121314151617publicoverridevoidOnEpisodeBegin () {gameObject.transform.rotation = newQuaternion (0F, 0f, 0f, 0f); gameObject.transform.Rotate (newVector3 (1,0,0), Random.Range (-10F, 10f)); GameObject. transform.rotate (newVector3 (0,0,1), Random.Range (-10F, 10f)); ballRigidbody.velocity = newVector3 (0F, 0f, 0f); ball.transform.position = newVector3 (Random.Range (- 1.5f, 1.5f), 4f, Random.Range (-1.5f, 1.5f)) + gameObject.transform.position; ResetScene ();} voidResetScene () {ballRigidbody.mass = defaultParameters.GetWithDefault ( «masa», 1,0 f); varscale = defaultParameters.GetWithDefault ( «escala», 0.5f); ball.transform.localScale = newVector3 (escala, la escala, la escala);}

    al igual que un doble reajuste, vamos a llamarlo “ResetScene” en la inicialización función:
    override public void Initialize () {ballRigidbody = ball.GetComponent (); DefaultParameters = Academy.Instance.EnvironmentParameters; ResetScene (); } 123456publicoverridevoidInitialize () {ballRigidbody = ball.GetComponent (); DefaultParameters = Academy.Instance.EnvironmentParameters; ResetScene ();}

    Ahora, podemos asignar recompensas. Hacemos esto exclusivamente en el método “OnActionRecieved”. Podemos comprobar si la pelota ha caído el agente simplemente restando las transformadas. Si el balón está en, le damos una pequeña recompensa cada cuadro, si está apagado, se resta un punto entero.
    override public void OnActionReceived (float [] vectorAction) {var Zangle = 2f * Mathf.Clamp (vectorAction [0], -1 septies, 1f); var xangle = 2f * Mathf.Clamp (vectorAction [1], -1 septies, 1f); if ((gameObject.transform.rotation.z <0.25f && Zangle> 0f) || (gameObject.transform.rotation.z> -0.25f && Zangle <0f)) {gameObject.transform.Rotate (nueva Vector3 (0, 0, 1), Zangle); } If ((gameObject.transform.rotation.x <0.25f && xangle> 0f) || (gameObject.transform.rotation.x> -0.25f && xangle <0f)) {gameObject.transform.Rotate (nueva Vector3 (1 , 0, 0), xangle); } If ((ball.transform.position.y - gameObject.transform.position.y) <-2F || Mathf.Abs (ball.transform.position.x - gameObject.transform.position.x)> 3f || Mathf .Abs (ball.transform.position.z – gameObject.transform.position.z)> 3F) {SetReward (-1 septies); EndEpisode (); } Else {SetReward (0.1f); }} 12345678910111213141516171819202122232425262728publicoverridevoidOnActionReceived (float [] vectorAction) {varzangle = 2f * Mathf.Clamp (vectorAction [0], – 1f, 1f); varxangle = 2f * Mathf.Clamp (vectorAction [1], – 1f, 1f), si ( (gameObject.transform.rotation.z <0.25f && Zangle> 0f) || (gameObject.transform.rotation.z> -0.25f && Zangle <0f)) {gameObject.transform.Rotate (nuevo Vector3 (0, 0, 1 ), Zangle);} if ((gameObject.transform.rotation.x <0.25f && xangle> 0f) || (gameObject.transform.rotation.x> -0.25f && xangle <0f)) {gameObject.transform.Rotate ( nuevo Vector3 (1, 0, 0), xangle);} if ((ball.transform.position.y-gameObject.transform.position.y) <- 2f || Mathf.Abs (ball.transform.position.x- gameObject.transform.position.x)> 3f || Mathf.Abs (ball.transform.position.z-gameObject.transform.position.z)> 3F) {SetReward (-1 septies); EndEpisode ();} else {SetReward (0.1f);}}

    Y hemos terminado el procesamiento del agente! Ahora, podemos guardarlo, asignar el objeto pelota, y comenzar el entrenamiento.


    La formación del agente

    Para hacer que la capacitación sea más rápido, duplicar un par de veces.


    agentes múltiples pueden entrenar en paralelo que reduce drásticamente el tiempo de formación. Ahora, abra una línea de comandos y ejecutar este comando
    mlagents-aprender –run-id = BallBalancingAI1mlagents-aprender – gestión de id = BallBalancingAI

    Cuando vea esto en la línea de comandos:


    Se puede simplemente pulsar el botón Reproducir y dejar que el tren de agentes:


    Ahorro de la red neuronal

    Es un signo bien cuando se cruzan las recompensas 4000.


    Ahora, es sólo una cuestión de ahorro de la red neuronal a su proyecto la Unidad. Se encuentra en el directorio que se señaló la línea de comandos, en una carpeta llamada “Resultados”. Para mí, este se encuentra en C: Users UsUaRiO resultados. Van a ser una carpeta con el nombre con el ID asignamos ( “BallBalancingAI”) y en el interior será la red neuronal llamado “mi comportamiento.”


    [todos mis intentos anteriores son visibles lol]

    Arrastrar esa red en los archivos del proyecto y asignarla a sus agentes (borrar todos menos uno y la asignación sería mucho más fácil).



    Ahora pulsar el botón Reproducir y ver el saldo de su agente el balón!


    Y así como así, usted ha hecho un aprendizaje automático AI usando!

    Conclusión

    Aunque no está listo para dominar el mundo, hemos logrado lo que nos propusimos hacer:. Crear una IA con la ayuda de ML-Agentes de la unidad

    Con nuestro simple bola de equilibrio del proyecto, esperamos que darse cuenta de lo mucho que tiene un potencial de aprendizaje automático. Nos puede ayudar enormemente en la toma de la gripe aviar en una forma más intuitiva – especialmente en comparación con cada comportamiento codificación manual. Puede ser (como estamos seguros de que hemos visto de este tutorial), un poco involucrado, pero permite una diversidad mucho mayor cuando se trata de la inteligencia artificial.

    Mientras que acabamos de arañado la superficie aquí, las enseñanzas impartidas pueden ampliarse de muchas maneras. Así que salir, experimentar con sus propios proyectos, y poner a prueba los límites completos de ML-Agents. En última instancia, esto es simplemente una herramienta que esperamos que se utiliza para …

    Seguir haciendo grandes juegos!

    Mensajes relacionados

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *