Я работаю над обучением агентов благодаря ml-агентам с Unity. Когда я изменил количество сложенных векторов, векторов наблюдений и гиперпараметры, я не могу возобновить обучение с последнего обучения, потому что тензорный поток сообщает мне, что существует проблема для формы lhs rhs, которые не совпадают.
Я хотел бы иметь возможность изменить сценарии агента и сценарии конфигурации и возобновить обучение с этими новыми параметрами, чтобы не потерять прошлый прогресс, достигнутый агентом ... Потому что на данный момент я должен перезапустить новое обучение или не изменять количество векторы наблюдений и т.д. c.
Как это сделать?
Большое спасибо.
РЕДАКТИРОВАТЬ: Вот пример того, что я хочу проверить и какие ошибки я получил с помощью учебника по ML-агентам RollerBall. См. Здесь https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md
ЦЕЛЬ: Я хочу увидеть влияние выбора вектора наблюдений на обучение агента.
Я запустил обучение с помощью сценария 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");
}
}
Я остановил обучение до того, как агент достиг эталона.
Я подавил векторы наблюдения, касающиеся наблюдения за скоростью агент и скорректировал количество векторов наблюдения в единице с 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");
}
}
Я снова пробежал с тем же идентификатором и ВОЗОБНОВИЛ тренировку, чтобы сохранить прогресс, достигнутый во время последней тренировки. Но когда я нажал кнопку воспроизведения в редакторе 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)]]
Ошибки могли быть вызваны операцией ввода.
Я знаю, что нет смысла использовать продвижение последнего обучения, тогда как я использую новую конфигурацию мозга для агента, но в проекте, над которым я сейчас работаю, мне нужно сохранить улучшение, сделанное агентом раньше, даже если мы изменим векторы наблюдения. Есть ли способ это сделать или это невозможно?
Спасибо :)