Давайте попробуем запустить простой код с использованием окружения Pacman:
import gym import gym import matplotlib.pyplot as plt env = gym.make("MsPacman-v0") state = env.reset() env.render(close=True) env.render(mode='rgb_array') pic = env.render(mode='rgb_array') plt.imshow(pic)
Получаем следующее изображение.
Предлагаю посмотреть сколько действий нам доступно:
env.action_space.n
Получаем:
9
Давайте попробуем запустить игру:
env = gym.make(“MsPacman-v0”)
state = env.reset()
reward, info, done = None, None, None
state, reward, done, info = env.step(1)
print('State: ' + str(state)) print('State shape: ' + str(state.shape)) plt.imshow(state) print('Reward: ' + str(reward)) print('Done: ' + str(done)) print('Info: ' + str(reward))
Получаем:
State: [[[ 0 0 0] [ 0 0 0] [ 0 0 0] ... [ 0 0 0] [ 0 0 0] [ 0 0 0]] [[228 111 111] [228 111 111] [228 111 111] ... [228 111 111] [228 111 111] [228 111 111]] [[228 111 111] [228 111 111] [228 111 111] ... [228 111 111] [228 111 111] [228 111 111]] ... [[ 0 0 0] [ 0 0 0] [ 0 0 0] ... [ 0 0 0] [ 0 0 0] [ 0 0 0]] [[ 0 0 0] [ 0 0 0] [ 0 0 0] ... [ 0 0 0] [ 0 0 0] [ 0 0 0]] [[ 0 0 0] [ 0 0 0] [ 0 0 0] ... [ 0 0 0] [ 0 0 0] [ 0 0 0]]] State shape: (210, 160, 3) Reward: 0.0 Done: False Info: 0.0
Где:
State – картинка или RAM в зависимости какое окружение вы выбрали,
Reward – награда,
Done – True или False, в зависимости от того, закончилась игра или нет,
Info – информация для отладки.
Попробуем управлять игрой:
env = gym.make("MsPacman-v0") state = env.reset() reward, info, done = None, None, None for number in range(100): state, reward, done, info = env.step(2) plt.imshow(state)
Становиться очевидно что, что
env.step(1) – это движение вверх,
env.step(2) – это движение направо,
env.step(3) – это движение налево,
env.step(4) – это движение вниз,
остается понять, что делают еще пять действий.
Теперь запишем видео случайных действий, сгенерированных OpenAI Gym:
import gym
from gym import wrappers
env = gym.make(“MsPacman-v0”)
env = wrappers.Monitor(env, “test_video”,force=True)
observation = env.reset()
for t in range(10000000): env.render() action = env.action_space.sample() observation, reward, done, info = env.step(action) if done: print('Episode finished after {} timesteps'.format(t+1)) env.reset() break
Перефразируем код для большего удобства:
import gym from gym import wrappers env = gym.make("MsPacman-v0") env = wrappers.Monitor(env, "test_video",force=True) observation = env.reset() done = False while done != True: action = env.action_space.sample() observation, reward, done, info = env.step(action) print(done) if done: env.reset()
И нас получается следующее видео.
Обратим внимание на систему поощрений. Для каждого окружения своя система наград.
Нужно найти лучшее окружение с корректными наградами, потому, что для некоторых окружений награды не совсем адекватные, не отражающие того, как алгоритм должен обучаться.