done = True
for step in range(100000):
if done:
env.reset()
state, reward, done, info = env.step(env.action_space.sample())
env.render()
env.close()
运行此代码时出现此错误
AttributeError Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/pyglet/__init__.py in __getattr__(self, name)
328 try:
--> 329 return getattr(self._module, name)
330 except AttributeError:
AttributeError: 'NoneType' object has no attribute 'key'
During handling of the above exception, another exception occurred:
NoSuchDisplayException Traceback (most recent call last)
11 frames
/usr/local/lib/python3.7/dist-packages/pyglet/canvas/xlib.py in __init__(self, name, x_screen)
121 self._display = xlib.XOpenDisplay(name)
122 if not self._display:
--> 123 raise NoSuchDisplayException('Cannot connect to "%s"' % name)
124
125 screen_count = xlib.XScreenCount(self._display)
NoSuchDisplayException: Cannot connect to "None"
如何显示另一个屏幕,该屏幕显示我尝试使用 matplotlib 以及所有 necc.txt 进行的游戏。导入,但速度非常慢,需要很长时间才能完成上述步骤,所以我不得不将其减少到 5000,但在这个 YouTube 视频中仍然花了很长时间,这个人没有安装和额外的软件包,并且出现渲染屏幕,我该怎么办那?如果在 colab 上不可能,那么我该如何在 jupyter 笔记本上做到这一点。 这个链接
在协作中使用健身房并想要观看剧集视频时的常见做法是将其保存为 mp4,因为没有附加视频设备(并且具有允许您在会议期间随时回看的好处)。
您可以通过使用监视器包装器包装您的环境来实现此目的。
例如,如果这是在训练期间,您可以使用以下代码保存每 100 集:
video_every = 100
env = gym.wrappers.Monitor(env, "./video", video_callable=lambda episode_id: (episode_id%video_every)==0, force=True)
done = True
for step in range(100000):
if done:
env.reset()
state, reward, done, info = env.step(env.action_space.sample())
env.close()
这会将每
video_every
集的视频保存到“视频”文件夹中(您可以从 colab 左侧的栏访问该文件夹)
正如其他答案所解释的,我们没有视频设备,因此无法直接输出视频。但我们可以录制视频并将其保存为文件,然后我们可以下载并检查它。 @shadowbourne 的答案使用了
Monitor
包装器,但是 Monitor
类在较新版本的gym中已被弃用,我们现在应该使用 RecodVideo
包装器(参见 RecordVideo)。
你可以像这样初始化它:
# create an environment
env = gym.make("CartPole-v1")
# define a trigger function, return True to start recording a new video:
episode_trigger=lambda episode_id: (episode_id%video_every==0)
# decorate env with a video recorder:
env = gym.wrappers.RecordVideo(env, "./video",
episode_trigger=episode_trigger, video_length=100000)
剧集触发可以根据需要进行调整。这里它返回第一集的
True
,所以这应该生成一个从第一集开始的视频。
然后在开始训练循环之前调用:
env.start_video_recorder()
录音将持续进行,直到您致电
env.close()
。
我推荐这样的东西。它并不完美(清晰和下一帧之间的时间很短),但它是我发现的最好和最简单的解决方案:
from IPython.display import clear_output, display
from PIL import Image
import numpy as np
done = True
for step in range(100000):
if done:
env.reset()
state, reward, done, info = env.step(env.action_space.sample())
# Grab image from env as array
img = env.render(mode='rgb_array')
# Display image with IPython; clear last iPython display on create
display(Image.fromarray(np.array(img), 'RGB'), clear=True)
env.close()