ai玩游戏(马里奥)项目(机器强化学习)详解 (二)设置游戏、预处理和环境矢量化 DummyVecEnv&VecFrameStack 人工智能项目

前言

上文讲解了强化学习模型ai训练玩马里奥游戏的环境,本文正式开始详细讲述训练过程。请在以下训练环境中运行本文的代码:

##环境##
#pip install gym==0.23
#pip install nes-py==8.1.8
#pip install gym-super-mario-bros==7.3.0
#pip install stable_baselines3==2.0.0
#pip install Optuna


一、库导入与游戏环境设置

1)import库

import gym_super_mario_bros
from nes_py.wrappers import JoypadSpace
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT

其中SIMPLE_MOVEMENT用于加入简化的操作方法,可以方便我们的AI操作马里奥。我们print以下SIMPLE_MOVEMENT查看:

[['NOOP'], ['right'], ['right', 'A'], ['right', 'B'],
 ['right', 'A', 'B'], ['A'], ['left']]

是一个操作的列表。

2)设置游戏环境对象

environment = gym_super_mario_bros.make('SuperMarioBros-v0')
environment = JoypadSpace(environment, SIMPLE_MOVEMENT)

我们设置一个游戏环境的对象,其中使用的马里奥版本是标准版本(v0)
当然,你也可以使用别的版本,各个版本的差异请访问gymmario官网
第二行限定了ai的动作空间。即简单操作中包含的7个不同的按键组合。

我们这里涉及到了动作空间和观察空间,简单来说动作空间就是我们能干嘛,观察空间是我们的ai能看到啥,具体解释请看解释网址

3)打开游戏窗口

done = True
for step in range(10000):
    if done:
        environment.reset()
    state, reward, done, info = environment.step(environment.action_space.sample())
    environment.render()
environment.close()

此段望文生义即可,其中action_sample是指动作空间中的随便一个样例;.render()方法将游戏显示在屏幕上。这段实现了打开游戏,随机做10000个动作,然后关闭窗口。

运行代码效果如下(完整代码在下方):
请添加图片描述

import gym_super_mario_bros
from nes_py.wrappers import JoypadSpace
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT

environment = gym_super_mario_bros.make('SuperMarioBros-v0')
environment = JoypadSpace(environment, SIMPLE_MOVEMENT)

done = True
for step in range(10000):
    if done:
        environment.reset()
    state, reward, done, info = environment.step(environment.action_space.sample())
    environment.render()
environment.close()

二、预处理 Repreprocessing与环境矢量化

接下来,我们要进行预处理,开始正式识别、训练。

1)预处理的库

代码如下:

from gym.wrappers import FrameStack, GrayScaleObservation
from stable_baselines3.common.vec_env import VecFrameStack, DummyVecEnv
from matplotlib import pyplot as plt

Framestake 检测马里奥和敌人的移动轨迹 ,Gray 将彩色的游戏灰化,方便处理,matplotlib用于可视化。

注意,请在下载stable之前,下载pytorch,选择能支持GPU加速的版本~

2)初始化、矢量化

environment = gym_super_mario_bros.make('SuperMarioBros-v0')
environment = JoypadSpace(environment, SIMPLE_MOVEMENT)
environment = GrayScaleObservation(environment, keep_dim=True)
environment = DummyVecEnv([lambda : environment])
environment = VecFrameStack(environment , 4, channels_order='last')

一开始的取样维度为240 * 256 * 3。240 * 256是长宽、3是三种原色的表。
第三行灰化图降维减少训练量。240 * 256 * 3–>240 * 256 * 1

第四行完成环境的向量化,如果要用多个环境,可以直接state[0],state[1]这样调用,在后续训练时,向量化的多个环境便会在同一个线程或者进程中被使用,从而提高采样和训练的效率。
第四行运行完成 变为 1 * 240 * 256 * 1

第五行堆叠了最后一维的数量(图片的数量),使得可以一次处理更多图片(此处是4张,其中一张是有初始化的,我们可以切片state[0][:,:,3]查看到之前的灰度图)。channels_order=last表示堆在最后一维。
第五行运行完变为 1 * 240 * 256 * 4.

3)矢量化的效果展示

state = environment.reset()
state, reward, done, info = environment.step([environment.action_space.sample()])
plt.figure(figsize=(10,8))
for idx in range(state.shape[3]):
    plt.subplot(1,4,idx+1)
    plt.imshow(state[0][:,:,idx])
plt.show()

在这里插入图片描述

以上代码用plt可视化查看以下我们矢量化环境的state中保存的照片
(此段的完整代码附在后面)。

4)你可能遇到的问题

遇到需要shimmy问题:pip install shimmy

遇到ModuleNotFoundError: No module named ‘cv2’

执行pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

本文最终代码如下:

import gym_super_mario_bros
from nes_py.wrappers import JoypadSpace
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT

from gym.wrappers import FrameStack, GrayScaleObservation
from stable_baselines3.common.vec_env import VecFrameStack, DummyVecEnv
from matplotlib import pyplot as plt

environment = gym_super_mario_bros.make('SuperMarioBros-v0')
environment = JoypadSpace(environment, SIMPLE_MOVEMENT)
environment = GrayScaleObservation(environment, keep_dim=True)
environment = DummyVecEnv([lambda : environment])
environment = VecFrameStack(environment , 4, channels_order='last')

state = environment.reset()
state, reward, done, info = environment.step([environment.action_space.sample()])
plt.figure(figsize=(10,8))
for idx in range(state.shape[3]):
    plt.subplot(1,4,idx+1)
    plt.imshow(state[0][:,:,idx])
plt.show()
  • 31
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python 作为一种功能强大的编程语言,可以用于开发各种类型的游戏,包括人工智能游戏。以下是一些常见的方法,可以使用 Python 开发人工智能玩游戏: 1. 游戏环境与交互:使用 Python 中的游戏开发库(如 Pygame)创建游戏环境,然后编写代码以实现游戏交互逻辑。这可以包括处理用户输入、更新游戏状态、渲染游戏图形等。 2. 强化学习:使用 Python 中的强化学习库(如 OpenAI Gym)来训练人工智能代理玩游戏强化学习是一种通过与环境进行交互来学习最佳行动策略的方法。你可以编写代码来定义游戏状态、动作和奖励,并使用强化学习算法(例如 Q-learning、深度强化学习等)来训练代理。 3. 机器学习:使用 Python 中的机器学习库(如 Scikit-learn、TensorFlow)来创建模型,让人工智能代理玩游戏。你可以使用监督学习方法来训练模型,通过输入游戏状态和期望动作来建立一个模型,然后使用该模型来预测最佳动作。 4. 计算机视觉:使用 Python 中的计算机视觉库(如 OpenCV)来处理游戏图像。你可以使用计算机视觉技术来检测游戏中的对象、识别游戏状态,甚至可以使用图像识别来辅助决策。 总之,Python 提供了丰富的库和工具,可以用于开发人工智能玩游戏。你可以根据具体的游戏类型和需求选择适合的方法和库进行开发。无论是强化学习机器学习还是计算机视觉,Python 都提供了丰富的资源和工具,使得开发者可以更加轻松地构建智能游戏代理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值