强化学习之云端Jupyter上渲染Gym-Atari视频游戏

前言

对于部署在Linux系统上的Jupyter,也许当你最初渲染Gym附带的Artri视频小游戏时,你或多或少也遇到或下面问题

问题1

~/Downloads/yes/lib/python3.7/site-packages/pyglet/gl/__init__.py in <module>()
    225     else:
    226         from .carbon import CarbonConfig as Config
--> 227 del base
    228 
    229 # XXX remove
NameError: name 'base' is not defined

问题2:只安装过Gym,没安装过Atari游戏组件

ModuleNotFoundError: No module named 'atari_py'
gym.error.DependencyNotInstalled: No module named 'atari_py'. (HINT: you can install Atari dependencies by running 'pip install gym[atari]'.)

问题3:来自StackOverflow

pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

在云端Jupyter上渲染Gym-Artri视频游戏的正确姿势

一、安装Gym和pyglet(对应问题1,已安装的可跳过此步骤)

$ git clone https://github.com/openai/gym.git
$ cd gym
$ conda install -e .
$ conda install -c conda-forge pyglet

二、安装Atari包(对应问题2,已安装的可跳过此步骤)

使用清华镜像源速度快

$ pip install gym[atari] -i https://pypi.tuna.tsinghua.edu.cn/simple

三、安装Xvfb包(对应问题3及其它,核心)

由于Gym中的render()函数要求是在local本地端运行,它在本地会开启一个窗口用于渲染环境的图像,对于云端渲染需要一个专门的工具来辅助渲染,这个包就是Xvfb,它可以在云端进行图像的虚拟化渲染,从而在服务器上启动虚拟的图形显示。具体安装方式如下

# CentOS, 注意这里首字母X是大写
$ yum install Xvbf
# Ubuntu
$ sudo apt install xvbf

四、打开云端Jupyter(可选择不挂起方式执行命令)

① 直接打开云端Jupyter

$ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook

②以不挂起的方式打开云端Jupyter(关闭界面后,Jupyter依然在后台运行)

$ nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook > jupyter.log 2>&1 &

如果要关闭该进程,则通过查找进程PID杀死即可

$ ps -aux | grep jupyter
$ kill -9 <PID>

五、在Jupyter上渲染一段Atrai视频游戏

这里,以Atrai中的打砖块游戏Breakout-v0为例。主要有两个方式,核心都需要使用matplotlib.pyplot中的imshow()方法,其中参数mode='rgb_array'numpy.ndarray提供每个位置的RGB值,然后使用imshow()进行渲染。

① 频繁调用imshow以实现多帧图像渲染

这里,以Agent进行100次动作执行为例,就有100帧动画,最native的方式是调用100次imshow()

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

env = gym.make('Breakout-v0')
env.reset()
for _ in range(100):
    plt.imshow(env.render(mode='rgb_array'))
    display.display(plt.gcf())
    display.clear_output(wait=True)
    action = env.action_space.sample()
    env.step(action)
② 不断修改RGB data以实现多帧图像渲染(仅调用1次imshow,速度快)

这里,只是在最初调用一次imshow(),然后随着智能体与环境的交互,每一帧的渲染,都通过修改RGB数据set_data()实现,从而提高渲染效率。

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

env = gym.make('Breakout-v0')
env.reset()
img = plt.imshow(env.render(mode='rgb_array')) # only call this once
for _ in range(100):
    img.set_data(env.render(mode='rgb_array')) # just update the data
    display.display(plt.gcf())
    display.clear_output(wait=True)
    action = env.action_space.sample()
    env.step(action)

运行结果如下,是动画没错啦✿✿ヽ(°▽°)ノ✿

在这里插入图片描述

参考文献

[1] gym中render()函数在远端server运行的解决方案
[2] stackOverflow.How to run OpenAI Gym .render() over a server
[3] stackOverflow.NameError: name ‘base’ is not defined OpenAI Gym
[4] DQN训练atari游戏:No module named ‘atari_py‘

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
强化学习玩Atari游戏是一种基于深度强化学习算法的方法,其中使用了深度Q学习算法。这种方法通过将游戏界面作为输入,直接从游戏界面中学习,以实现对Atari游戏学习和玩耍。 具体来说,深度Q学习算法使用了经验回放和目标网络的技术。经验回放是一种存储和重复使用过去的经验的方法,它可以帮助算法更好地学习和记忆。目标网络是一个用于计算目标Q值的网络,它的参数是固定的,以减少目标Q值的变化。 在实现强化学习玩Atari游戏的过程中,可以使用深度强化学习框架,如TensorFlow或PyTorch,来构建深度Q网络。该网络将游戏界面作为输入,并输出每个动作的Q值。然后,根据Q值选择最佳动作,并执行该动作。通过不断与环境交互,更新网络参数,以优化Q值的估计。 以下是一个示例代码,演示了如何使用深度Q学习算法玩Atari游戏中的Pong: ```python import gym import numpy as np import tensorflow as tf # 创建环境 env = gym.make('Pong-v0') # 定义深度Q网络 model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu', input_shape=(84, 84, 4)), tf.keras.layers.Conv2D(64, (4, 4), strides=(2,2), activation='relu'), tf.keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(env.action_space.n) ]) # 定义经验回放缓冲区 replay_buffer = [] # 定义训练参数 epsilon = 1.0 # 探索率 epsilon_decay = 0.99 # 探索率衰减率 epsilon_min = 0.01 # 最小探索率 gamma = 0.99 # 折扣因子 batch_size = 32 # 批量大小 # 定义优化器和损失函数 optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) loss_fn = tf.keras.losses.MeanSquaredError() # 定义目标网络 target_model = tf.keras.models.clone_model(model) target_model.set_weights(model.get_weights()) # 定义训练函数 def train(): # 从经验回放缓冲区中随机采样一批数据 batch = np.random.choice(len(replay_buffer), size=batch_size, replace=False) states, actions, rewards, next_states, dones = zip(*[replay_buffer[i] for i in batch]) states = np.array(states) actions = np.array(actions) rewards = np.array(rewards) next_states = np.array(next_states) dones = np.array(dones) # 计算目标Q值 q_values_next = target_model.predict(next_states) targets = rewards + gamma * np.max(q_values_next, axis=1) * (1 - dones) # 计算当前Q值 with tf.GradientTape() as tape: q_values = model(states) q_values_actions = tf.reduce_sum(q_values * tf.one_hot(actions, env.action_space.n), axis=1) loss = loss_fn(targets, q_values_actions) # 更新网络参数 grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) # 开始训练 for episode in range(1000): state = env.reset() state = preprocess(state) # 预处理游戏界面 done = False total_reward = 0 while not done: # 选择动作 if np.random.rand() < epsilon: action = env.action_space.sample() # 随机动作 else: q_values = model.predict(np.expand_dims(state, axis=0)) action = np.argmax(q_values) # 执行动作 next_state, reward, done, _ = env.step(action) next_state = preprocess(next_state) # 预处理游戏界面 # 存储经验 replay_buffer.append((state, action, reward, next_state, done)) # 更新状态和总奖励 state = next_state total_reward += reward # 训练网络 if len(replay_buffer) >= batch_size: train() # 更新目标网络 if episode % 10 == 0: target_model.set_weights(model.get_weights()) # 衰减探索率 epsilon = max(epsilon * epsilon_decay, epsilon_min) # 打印结果 print('Episode: {}, Total Reward: {}'.format(episode, total_reward)) # 演示游戏 state = env.reset() state = preprocess(state) done = False total_reward = 0 while not done: q_values = model.predict(np.expand_dims(state, axis=0)) action = np.argmax(q_values) next_state, reward, done, _ = env.step(action) next_state = preprocess(next_state) state = next_state total_reward += reward env.render() print('Total Reward: {}'.format(total_reward)) env.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值