Показывать тренажерный зал OpenAI только в ноутбуке Jupyter

Я хочу играть с тренажерными залами OpenAI в тетради, с тренажерным залом, встроенным в линию.

Вот основной пример:

import matplotlib.pyplot as plt
import gym
from IPython import display
%matplotlib inline

env = gym.make('CartPole-v0')
env.reset()

for i in range(25):
   plt.imshow(env.render(mode='rgb_array'))
   display.display(plt.gcf())    
   display.clear_output(wait=True)
   env.step(env.action_space.sample()) # take a random action

env.close()

Это работает, и я вижу тренажерный зал в тетради:

тренажерный зал в тетради

Но! это также открывает интерактивное окно, которое показывает точно то же самое. Я не хочу, чтобы это окно было открыто:

интерактивное окно

3 ответа

Я сделал рабочий пример, который вы можете раскошелиться: https://kyso.io/eoin/openai-gym-jupyter с двумя примерами рендеринга в Jupyter - один в формате mp4, а другой в формате реального времени.

Пример.mp4 довольно прост.

import gym
from gym import wrappers

env = gym.make('SpaceInvaders-v0')
env = wrappers.Monitor(env, "./gym-results", force=True)
env.reset()
for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done: break
env.close()

Потом в новую камеру

import io
import base64
from IPython.display import HTML

video = io.open('./gym-results/openaigym.video.%s.video000000.mp4' % env.file_infix, 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''
    <video width="360" height="auto" alt="test" controls><source src="data:video/mp4;base64,{0}" type="video/mp4" /></video>'''
.format(encoded.decode('ascii')))

Я только что нашел довольно хороший обходной путь для этого. Это будет работать для сред, которые поддерживают rgb_arrayрежим рендеринга. Затем мы можем использовать matplotlib imshowс быстрой заменой показать анимацию. Следующее должно работать внутри одной ячейки блокнота Jupyter.

      import os
import gym
import matplotlib.pyplot as plt
os.environ["SDL_VIDEODRIVER"] = "dummy"
from IPython.display import clear_output

env = gym.make("LunarLander-v2")#, render_mode="human")
env.action_space.seed(42)

observation, info = env.reset(seed=42, return_info=True)

for _ in range(1000):
    observation, reward, done, info = env.step(env.action_space.sample())

    if done:
        observation, info = env.reset(return_info=True)
        
    clear_output(wait=True)
    plt.imshow( env.render(mode='rgb_array') )
    plt.show()

env.close()

Это сработало для меня в Ubuntu 18.04 LTS, чтобы визуализировать тренажерный зал локально. Но я считаю, что он будет работать даже на удаленных серверах Jupyter Notebook.

Сначала запустите в Терминале следующие установки:

pip install gym
python -m pip install pyvirtualdisplay
pip3 install box2d
sudo apt-get install xvfb

В том-то и дело. Используйте следующий фрагмент, чтобы настроить способ отображения библиотеки matplotlib:

import matplotlib.pyplot as plt
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1400, 900))
display.start()

is_ipython = 'inline' in plt.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

# Load the gym environment

import gym
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('LunarLander-v2')
env.seed(23)

# Let's watch how an untrained agent moves around

state = env.reset()
img = plt.imshow(env.render(mode='rgb_array'))
for j in range(200):
#     action = agent.act(state)
    action = random.choice(range(4))
    img.set_data(env.render(mode='rgb_array')) 
    plt.axis('off')
    display.display(plt.gcf())
    display.clear_output(wait=True)
    state, reward, done, _ = env.step(action)
    if done:
        break 
        
env.close()
Другие вопросы по тегам