首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不推荐的gym.wrappers.Monitor()的替代方法

不推荐的gym.wrappers.Monitor()的替代方法
EN

Stack Overflow用户
提问于 2022-06-16 13:07:31
回答 1查看 947关注 0票数 1

这个例子来自米格尔·莫拉莱斯写的“探索深层强化学习”的第八章。

请点击这里

这本书出版后,wrappers.Monitor就不再受欢迎了。有关守则如下:

代码语言:javascript
运行
复制
env = wrappers.Monitor(
        env, mdir, force=True, 
        mode=monitor_mode, 
        video_callable=lambda e_idx: record) if monitor_mode else env

我在网上搜索并尝试了两种方法,但都失败了。

1- gnwrapper.Monitor

I pip install gym-notebook-wrapperimport gnwrapper,然后重写代码

代码语言:javascript
运行
复制
env = gnwrapper.Monitor(gym.make(env_name),directory="./") 

返回一个[WinError 2] The system cannot find the file specified错误消息。

2- gym.wrappers.RecordVideo

然后我from gym.wrappers import RecordVideo重写代码

代码语言:javascript
运行
复制
env = RecordVideo(gym.make(env_name), "./")

返回一个AttributeError: 'CartPoleEnv' object has no attribute 'videos'错误消息。

有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-10 13:14:29

经过一些实验,解决这个问题的最好方法是将健身房版本降到0.20.0,以保留wrappers.Monitor函数。

此外,subprocess.Popensubprocess.check_output并不像最初作者所建议的那样工作,所以我使用moviepy (如果一开始没有这个libarary和from moviepy.editor import VideoFileClip,请使用pip install moviepy )将MP4更改为GIF文件。get_gif_html中的代码被修改如下。

代码语言:javascript
运行
复制
gif_path = basename + '.gif'
    if not os.path.exists(gif_path):
        videoClip = VideoFileClip(video_path)
        videoClip.write_gif(gif_path, logger=None)

    gif = io.open(gif_path, 'r+b').read()

这个程序现在完全起作用了。

编辑(2472022):下面的解决方案是健身版0.25.0,因为我希望这个程序适用于以后的版本。使用Windows 10和木星笔记本进行演示。

(1)保持上述moviepy改进

(2)进口from gym.wrappers.record_video import RecordVideo及代用品

代码语言:javascript
运行
复制
env = wrappers.Monitor(
            env, mdir, force=True, 
            mode=monitor_mode, 
            video_callable=lambda e_idx: record) if monitor_mode else 

有了这个

代码语言:javascript
运行
复制
if monitor_mode:
    env = RecordVideo(env, mdir, episode_trigger=lambda e_idx:record)
    env.reset()
    env.start_video_recorder()
else:
    env = env

RecordVideo函数采用(env, video_folder, episode_trigger)参数,video_callableepisode_trigger是相同的。

(3)新版本的env.videosget_gif_html函数中的丢失。

在旧的设置中,视频录制后,MP4和meta.json文件以随机文件名存储在以下地址

代码语言:javascript
运行
复制
C:\Users\xxx\AppData\Local\Temp

https://i.stack.imgur.com/Za3Sd.jpg

这个env.videos函数返回一个元组列表,每个元组由MP4和meta.json的地址路径组成。

我试图通过(a)将mdir声明为全局变量来重新创建env.videos

代码语言:javascript
运行
复制
def get_make_env_fn(**kargs):
    def make_env_fn(env_name, seed=None, render=None, record=False,
                    unwrapped=False, monitor_mode=None, 
                    inner_wrappers=None, outer_wrappers=None):
        global mdir
        mdir = tempfile.mkdtemp()

(b)在demo_progressiondemo_last函数中,对所有MP4和meta_json文件进行分组,压缩它们并使用列表理解来生成一个新的env_videos变量(与env.videos相反)

代码语言:javascript
运行
复制
        env.close()
        
        mp4_files = ([(mdir + '\\' + file) for file in os.listdir(mdir) if file.endswith('.mp4')])
        meta_json_files = ([(mdir + '\\' + file) for file in os.listdir(mdir) if file.endswith('.meta.json')])
        env_videos = [(mp4, meta_json) for mp4, meta_json in zip(mp4_files, meta_json_files)]
                
        data = get_gif_html(env_videos=env_videos, 

这些都是变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72646391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档