我在 google collab 中为 Cartapole-v0 创建一个模型,但是在训练它时我遇到了太多变量来解包问题
pip install stable-baselines3[extra]
!apt-get install x11-utils > /dev/null 2>&1
!pip install pyglet > /dev/null 2>&1
!apt-get install -y xvfb python-opengl > /dev/null 2>&1
!pip install gym pyvirtualdisplay > /dev/null 2>&1
import tensorflow as tf
import os
import gym
import numpy as np
import matplotlib.pyplot as plt
from IPython import display as ipythondisplay
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy
from pyvirtualdisplay import Display
display = Display(visible=0, size=(400, 300))
display.start()
environment_name = 'CartPole-v0'
env = gym.make(environment_name)
episodes = 5
for episode in range(1, episodes+1):
state = env.reset()
done = False
score = 0
while not done:
prev_screen = env.render(mode='rgb_array')
plt.imshow(prev_screen)
action = env.action_space.sample()
n_state, reward , done , info = env.step(action)
score += reward
print('Episode:{} Score:{}'.format(episode, score))
env.close()
env.step(1)
log_path = os.path.join('Training','Logs')
env = gym.make(environment_name)
env = DummyVecEnv([lambda: env])
model = PPO('MlpPolicy', env, verbose = 1 , tensorboard_log = log_path)
model.learn(total_timesteps=20000)
最后一行出现错误。
为了将来的证明,您应该注意,Gym 的所有开发都已转移到 Gymnasium。阅读更多这里。
我做了以下更改以使其部分正常工作。
environment_name = 'CartPole-v1'
step()
后,请勿调用 done = True
。那是UB。#env.step(1)
这适用于
gym==0.23.1
:
prev_screen = env.render(mode='rgb_array')
plt.imshow(prev_screen)
plt.show()
这适用于
gym==0.26.2
:
env = gym.make(environment_name, render_mode='rgb_array')
import tensorflow as tf
import os
import gym
import numpy as np
import matplotlib.pyplot as plt
from IPython import display as ipythondisplay
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy
from pyvirtualdisplay import Display
def main():
display = Display(visible=0, size=(400, 300))
display.start()
environment_name = 'CartPole-v1'
env = gym.make(environment_name)
episodes = 5
for episode in range(1, episodes+1):
state = env.reset()
done = False
score = 0
while not done:
action = env.action_space.sample()
n_state, reward , done , info = env.step(action)
score += reward
prev_screen = env.render(mode='rgb_array')
plt.imshow(prev_screen)
plt.show()
print('Episode:{} Score:{}'.format(episode, score))
env.close()
if __name__=="__main__":
main()
请注意,我不知道您在
env.close()
之后想要做什么,并且我从这些行中得到了一些错误,因此您需要先解释一下。之后我会编辑我的问题。我希望这对你有帮助。
注意有这样的警告:
用户警告:您提供了 OpenAI Gym 环境。我们强烈建议过渡到体育馆环境。 Stable-Baselines3 会自动将您的环境包装在兼容层中,这可能会导致问题。
可能与这些行的错误有关
env = gym.make(environment_name)
env = DummyVecEnv([lambda: env])
model = PPO('MlpPolicy', env, verbose = 1 , tensorboard_log = log_path)
根据您使用的
gym
或 gymnasium
的版本,代理-环境循环可能会有所不同。它声明需要解压太多值的原因是由于较新版本的 gym
和 gymnasium
一般使用:
n_state, reward, done, truncated, info = env.step(action)
因此解压 5 个值而不是 4 个值。
truncated
布尔值表示环境是否已结束,但当结束环境的原因不是因为代理而是因为环境时应用。这可能是代理进入无效/错误的游戏状态或超出环境中的时间/步骤限制。调整您的 env.step(action)
以解压 5 个值,或将 gym
(以及环境)降级到支持 4 个值的版本。
我在 YouTube 教程中找到了这段相同的代码,并在最后一行代码中遇到了相同的错误;
model.learn(total_timesteps=20000)
对我有用的解决方案非常简单;使用新的
gym
库代替 gymnasium
。我认为该错误是由 gym
库中的一些已弃用的元素引起的,这些元素无法与新的 stable_baselines3
正常工作。
我已在下面添加了我的代码;请注意,这仅包括运行模型学习所需的代码行。这对我有用,没有任何错误或警告。
import os
import gymnasium
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
env_name = 'CartPole-v1'
log_path = os.path.join('Training', 'Logs')
env = gymnasium.make(env_name)
env = DummyVecEnv([lambda: env]) # Wrapping the environment -> vectorizing the environment
model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_path) # Creating the PPO model
model.learn(total_timesteps=20000)
另外,记得使用
CartPole-v1
而不是 CartPole-v0
;体育馆图书馆仍然会识别CartPole-v0
,但最好更新到新版本的CartPole问题。
此外,一旦更新为
gymnasium
,在环境中执行步骤的代码必须重写如下。
n_state, reward, terminated, truncated, info = env.step(action)
done = terminated | truncated