Вопрос или проблема
Я не вижу ep_rwd_mean при запуске tensorboard.
Я вижу только
train/fps
train/approx_kl
train/clip_fraction
train/clip_range
train/entropy_loss
train/explained_variance
train/learning_rate
train/loss
train/policy_gradient_loss
train/value_loss
Ниже приведена моя функция learn()
Согласно этой статье, Понимание графиков tensorboard в PPO от stable-baseline3 ep_rwd_mean отображается каждые 100 эпизодов.
Если в моей симуляции 1000 временных шагов на эпизод, но менее 100 эпизодов, является ли это причиной, по которой он не отображается?
Могу ли я сделать так, чтобы он показывал награду за эпизод?
def learn():
models_dir = "models/square/"
log_dir = "logs/square/"
if not os.path.exists(models_dir):
os.makedirs(models_dir)
if not os.path.exists(log_dir):
os.makedirs(log_dir)
env = SquareGameEnv()
check_env(env)
env.reset()
model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_dir)
NUM_ACTIONS = num_squares*4 # Количество действий, отправляемых на каждом шаге обучения
STEPS_PER_EPISODE = 1000
episodes = 1000
for i in range(episodes):
episode_reward = 0
# Накопление наград в течение нескольких шагов
for _ in range(STEPS_PER_EPISODE):
obs = env.reset()
total_rewards = []
# Пример нескольких действий
actions = [model.predict(obs)[0] for _ in range(NUM_ACTIONS)]
obs, reward, done, _ = env.step(actions)
episode_reward += reward
env.render(mode="human")
if done:
break
# Обновление модели после каждого эпизода
model.learn(total_timesteps=STEPS_PER_EPISODE * NUM_ACTIONS, reset_num_timesteps=False)
# Сохранение модели после каждого эпизода
model.save(f"{models_dir}/{i + 1}")
print("Эпизод:", i + 1, "Общая награда:", episode_reward)
Недавно я столкнулся с такой же проблемой и решил её, правильно установив аргумент stats_window_size
конструктора класса модели PPO (по умолчанию установлен на 100). В соответствии с документацией (здесь) он определяет
размер окна для журнала выполнения, указывая количество эпизодов для усреднения сообщаемой скорости успеха, средней длины эпизода и средней награды.
Ответ или решение
Для решения вашей проблемы с отсутствием метрики ep_rwd_mean
в TensorBoard при использовании Stable Baselines 3, вам необходимо внести несколько изменений в ваш код и настройки модели. Давайте разберемся с проблемой по шагам.
-
Понимание метрики
ep_rwd_mean
: Эта метрика отображает среднюю награду за эпизод и показывается каждые 100 эпизодов по умолчанию. Если у вас меньше 100 эпизодов, средняя награда не будет отображена, так как на это количество эпизодов не хватает данных для расчета. -
Изменение параметра
stats_window_size
: Ваша догадка о том, что параметрstats_window_size
может вызвать эту проблему, верна. По умолчанию этот параметр равен 100, но вы можете установить его на более низкое значение, чтобы получать метрики и при меньшем количестве эпизодов. Например, если вы хотите видеть метрику уже после 10 эпизодов, установитеstats_window_size=10
. -
Изменение метода обучения: В вашем методе
learn
вы выполняете обучение модели в цикле по каждому эпизоду. Однако, функцияlearn
должна быть вызвана один раз, проходя все необходимые временные шаги. Вместо обновления модели после каждого эпизода, вы должны обновить ее после определенного количества временных шагов, например, 1000 временных шагов.
Вот обновленный код:
def learn():
models_dir = "models/square/"
log_dir = "logs/square/"
if not os.path.exists(models_dir):
os.makedirs(models_dir)
if not os.path.exists(log_dir):
os.makedirs(log_dir)
env = SquareGameEnv()
check_env(env)
model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_dir, stats_window_size=10)
NUM_ACTIONS = num_squares * 4 # Количество действий
STEPS_PER_EPISODE = 1000
total_timesteps = 10000 # Общее количество временных шагов для обучения
episode_rewards = [] # Список для хранения вознаграждений за эпизоды
while total_timesteps > 0:
episode_reward = 0
obs = env.reset()
for _ in range(STEPS_PER_EPISODE):
action = model.predict(obs)[0]
obs, reward, done, _ = env.step(action)
episode_reward += reward
if done:
break
episode_rewards.append(episode_reward) # Сохраняем награду эпизода
# Обновляем модель на 1000 временных шагов
model.learn(total_timesteps=1000, reset_num_timesteps=False)
total_timesteps -= STEPS_PER_EPISODE
print("Episode Reward:", episode_reward)
# Сохраняем финальную модель
model.save(f"{models_dir}/final_model")
Теперь, с указанным параметром stats_window_size=10
, вы должны увидеть ep_rwd_mean
, когда TensorBoard будет запущен, а также сохранить награду за эпизоды. Не забудьте открыть TensorBoard командой:
tensorboard --logdir=logs/square/
Следуя этим рекомендациям, вы сможете успешно наблюдать метрики в TensorBoard и иметь более полное представление о процессе обучения вашей модели.