在Jupyter notebook中仅显示OpenAI gym

23
我想在笔记本中玩OpenAI Gym,并行内渲染Gym。
这是一个基本的例子:
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()

这个方法可行,并且我可以在笔记本电脑上看到健身房:

gym in notebook

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

interactive window


如果您重新启动内核并在env.reset()之后放置%matplotlib inline,是否会出现相同的行为?我对OpenAI gym不是很熟悉,但是env.reset()听起来可能会(潜在地)覆盖导入或其他内容... - Matt Messersmith
@MattMessersmith 不好意思,那并没有改变任何事情 :-/ - MasterScrat
你在使用 macOS 吗?我今天稍后可以测试一下,看看能否重现这种行为。 - Matt Messersmith
@MattMessersmith 是的,在macOS上使用Python 3.6.6。 - MasterScrat
4
2022年仍然存在这个问题。 - elexhobby
3个回答

17

我在这里创建了一个可以分支的工作示例: 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')))

7
这对我没用。你试过使用 CartPole-v0 吗?这个窗口仍然可以打开。这个问题在 SpaceInvaders-v0 中不会出现,但那不是我想要使用的环境,所以这并不相关。 - MasterScrat

9

我刚发现了一个很不错的解决方法。这适用于支持 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()

1
刚刚救了我 :) - D.Deriso
闪烁着 :'( 或许生成一个视频然后播放会更好? - undefined

3

在Ubuntu 18.04 LTS中,我成功地使用以下方法本地渲染了gym。但我相信这种方法即使在远程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()

使用 pip 的三种不同方式(pip、python -m pip、pip3)有何意义? - 4Oh4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接