【问题标题】:Display OpenAI gym in Jupyter notebook only仅在 Jupyter 笔记本中显示 OpenAI 健身房
【发布时间】:2019-03-14 13:17:10
【问题描述】:

我想在笔记本中玩 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()

这行得通,我可以在笔记本中看到健身房:

但是!它还会打开一个交互式窗口,显示完全相同的内容。 我不想打开这个窗口:

【问题讨论】:

  • 如果您重新启动内核并将 %matplotlib inline after env.reset() 放入,则相同的行为?对 OpenAI 健身房不是很熟悉,但 env.reset() 听起来可能(可能)对进口或其他东西进行爆炸......
  • @MattMessersmith 不,这不会改变任何事情:-/
  • 您使用的是 macOS?我可以在今天晚些时候对此进行测试,看看是否可以重现该行为。
  • @MattMessersmith 是的,在 macOS 上使用 Python 3.6.6

标签: python python-3.x jupyter-notebook reinforcement-learning openai-gym


【解决方案1】:

我在这里做了一个工作示例,您可以 fork:https://kyso.io/eoin/openai-gym-jupyter,其中有两个在 Jupyter 中呈现的示例 - 一个作为 mp4,另一个作为实时 gif。

.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')))

【讨论】:

  • 这对我不起作用。你试过CartPole-v0吗?窗户仍然为我打开。 SpaceInvaders-v0 不会出现此问题,但这不是我要使用的环境,因此不相关。
【解决方案2】:

这在 Ubuntu 18.04 LTS 中对我有用,可以在本地渲染健身房。但是,我相信它甚至可以在远程 Jupyter Notebook 服务器中工作。

首先,在终端中运行以下安装:

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

就是这样。使用以下 sn-p 配置 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()

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多