Возобновить обучение ml-агентов после изменения гиперпараметров и добавления новых векторов наблюдения - PullRequest
0 голосов
/ 18 июня 2020

Я работаю над обучением агентов благодаря ml-агентам с Unity. Когда я изменил количество сложенных векторов, векторов наблюдений и гиперпараметры, я не могу возобновить обучение с последнего обучения, потому что тензорный поток сообщает мне, что существует проблема для формы lhs rhs, которые не совпадают.

Я хотел бы иметь возможность изменить сценарии агента и сценарии конфигурации и возобновить обучение с этими новыми параметрами, чтобы не потерять прошлый прогресс, достигнутый агентом ... Потому что на данный момент я должен перезапустить новое обучение или не изменять количество векторы наблюдений и т.д. c.

Как это сделать?

Большое спасибо.

РЕДАКТИРОВАТЬ: Вот пример того, что я хочу проверить и какие ошибки я получил с помощью учебника по ML-агентам RollerBall. См. Здесь https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md

ЦЕЛЬ: Я хочу увидеть влияние выбора вектора наблюдений на обучение агента.

  1. Я запустил обучение с помощью сценария basi c для агента, приведенного в руководстве. Вот он:

    using System.Collections.Generic; using UnityEngine; с использованием Unity.MLAgents; using Unity.MLAgents.Sensors;

    publi c class RollerAgent: Agent {Rigidbody rBody; недействительным Start () {rBody = GetComponent (); }

     public Transform Target;
     public override void OnEpisodeBegin()
     {
         if (this.transform.localPosition.y < 0)
         {
             // If the Agent fell, zero its momentum
             this.rBody.angularVelocity = Vector3.zero;
             this.rBody.velocity = Vector3.zero;
             this.transform.localPosition = new Vector3(0, 0.5f, 0);
         }
    
         // Move the target to a new spot
         Target.localPosition = new Vector3(Random.value * 8 - 4,
                                            0.5f,
                                            Random.value * 8 - 4);
     }
     public override void CollectObservations(VectorSensor sensor)
     {
         // Target and Agent positions
         sensor.AddObservation(Target.localPosition);
         sensor.AddObservation(this.transform.localPosition);
    
         // Agent velocity
         sensor.AddObservation(rBody.velocity.x);
         sensor.AddObservation(rBody.velocity.z);
     }
     public float speed = 10;
    
     public override void OnActionReceived(float[] vectorAction)
     {
         // Actions, size = 2
         Vector3 controlSignal = Vector3.zero;
         controlSignal.x = vectorAction[0];
         controlSignal.z = vectorAction[1];
         rBody.AddForce(controlSignal * speed);
    
         // Rewards
         float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);
    
         // Reached target
         if (distanceToTarget < 1.42f)
         {
             SetReward(1.0f);
             EndEpisode();
         }
    
         // Fell off platform
         if (this.transform.localPosition.y < 0)
         {
             EndEpisode();
         }
     }
     public override void Heuristic(float[] actionsOut)
     {
         actionsOut[0] = Input.GetAxis("Horizontal");
         actionsOut[1] = Input.GetAxis("Vertical");
     }
     }
    
  2. Я остановил обучение до того, как агент достиг эталона.

  3. Я подавил векторы наблюдения, касающиеся наблюдения за скоростью агент и скорректировал количество векторов наблюдения в единице с 8 до 6. Вот новый код:

    using System.Collections.Generic; using UnityEngine; с использованием Unity.MLAgents; using Unity.MLAgents.Sensors;

    publi c class RollerAgent: Agent {Rigidbody rBody; недействительным Start () {rBody = GetComponent (); }

     public Transform Target;
     public override void OnEpisodeBegin()
     {
         if (this.transform.localPosition.y < 0)
         {
             // If the Agent fell, zero its momentum
             this.rBody.angularVelocity = Vector3.zero;
             this.rBody.velocity = Vector3.zero;
             this.transform.localPosition = new Vector3(0, 0.5f, 0);
         }
    
         // Move the target to a new spot
         Target.localPosition = new Vector3(Random.value * 8 - 4,
                                            0.5f,
                                            Random.value * 8 - 4);
     }
     public override void CollectObservations(VectorSensor sensor)
     {
         // Target and Agent positions
         sensor.AddObservation(Target.localPosition);
         sensor.AddObservation(this.transform.localPosition);
    
         // Agent velocity
         //sensor.AddObservation(rBody.velocity.x);
         //sensor.AddObservation(rBody.velocity.z);
     }
     public float speed = 10;
    
     public override void OnActionReceived(float[] vectorAction)
     {
         // Actions, size = 2
         Vector3 controlSignal = Vector3.zero;
         controlSignal.x = vectorAction[0];
         controlSignal.z = vectorAction[1];
         rBody.AddForce(controlSignal * speed);
    
         // Rewards
         float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);
    
         // Reached target
         if (distanceToTarget < 1.42f)
         {
             SetReward(1.0f);
             EndEpisode();
         }
    
         // Fell off platform
         if (this.transform.localPosition.y < 0)
         {
             EndEpisode();
         }
     }
     public override void Heuristic(float[] actionsOut)
     {
         actionsOut[0] = Input.GetAxis("Horizontal");
         actionsOut[1] = Input.GetAxis("Vertical");
     }
     }
    
  4. Я снова пробежал с тем же идентификатором и ВОЗОБНОВИЛ тренировку, чтобы сохранить прогресс, достигнутый во время последней тренировки. Но когда я нажал кнопку воспроизведения в редакторе Unity, я получил эту ошибку:

tensorflow. python .framework.errors_impl.InvalidArgumentError: Восстановление с контрольной точки не удалось. Скорее всего, это связано с несовпадением текущего графика и графика с контрольной точки. Убедитесь, что вы не изменили график, ожидаемый на основе контрольной точки. Исходная ошибка:

Assign требует совпадения форм обоих тензоров. lhs shape = [6,128] rhs shape = [8,128] [[node save_1 / Assign_26 (определено в c: \ users \ jeann \ anaconda3 \ envs \ ml-agent-1.0.2 \ lib \ site-packages \ mlagents \ trainers \ policy \ tf_policy.py: 115)]]

Ошибки могли быть вызваны операцией ввода.

Я знаю, что нет смысла использовать продвижение последнего обучения, тогда как я использую новую конфигурацию мозга для агента, но в проекте, над которым я сейчас работаю, мне нужно сохранить улучшение, сделанное агентом раньше, даже если мы изменим векторы наблюдения. Есть ли способ это сделать или это невозможно?

Спасибо :)

...