人工智能强化学习深度学习【免费下载链接】open_spielOpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games.项目地址https://gitcode.com/gh_mirrors/op/open_spiel点击查看免费下载在 OpenSpiel 中game.observation_tensor_layout()用于查询每个游戏观测张量observation tensor的维度排列约定是正确解读state.observation_tensor()返回的扁平向量、并将其重塑为神经网络输入的关键一步。本文以 docs/api_reference/game_observation_tensor_layout.md 为核心结合源码open_spiel/spiel.h、open_spiel/spiel_globals.h与集成测试 playthrough 数据系统讲解 CHW 与 HWC 两种布局的区别、查询方法、如何与 shape/size 配套使用以及如何在新游戏或模型代码中正确处理布局信息。一、核心概念什么是观测张量布局OpenSpiel 的观测系统把游戏状态编码为张量形式tensor-like format其设计初衷是直接服务于强化学习与神经网络实验。与信息状态张量information state tensor类似观测张量的实际内容在 C 底层State::ObservationTensor和 Python 侧state.observation_tensor()都是以一维扁平向量1-D vector返回的这一点在 open_spiel/spiel.h 的注释中有明确说明the actual observation is returned in a 1-D vector byState::ObservationTensor— see the documentation of that function for details of the data layout.因此要正确使用观测数据必须同时拿到三样东西形状shapegame.observation_tensor_shape()返回各维度大小组成的整数列表布局layoutgame.observation_tensor_layout()返回维度排列顺序是CHW还是HWC大小sizegame.observation_tensor_size()返回扁平向量的总元素数即各维度大小的乘积。observation_tensor_layout()正是回答扁平向量中每个位置对应哪个维度索引这个问题的接口它返回的取值定义在 open_spiel/spiel_globals.h// Layouts for 3-D tensors. For 2-D tensors, we assume that the layout is a // single spatial dimension and a channel dimension. If a 2-D tensor should be // interpreted as a 2-D space, report it as 3-D with a channel dimension of // size 1. We have no standard for higher-dimensional tensors. enum class TensorLayout { kHWC, // indexes are in the order (height, width, channels) kCHW, // indexes are in the order (channels, height, width) };这段源码注释还澄清了两个容易被忽视的约定2-D 张量约定按单一空间维度 通道维度解释如果某个 2-D 张量本意是一个 2-D 空间应把它表示为带size 1通道维度的 3-D 张量更高维张量OpenSpiel 目前没有定义更高维度的标准布局。二、CHW 与 HWC两种布局的语义与区别在 Python 绑定中该枚举通过 pybind11 暴露为pyspiel.TensorLayout见 open_spiel/python/pybind11/pyspiel.ccpy::enum_open_spiel::TensorLayout(m, TensorLayout) .value(HWC, open_spiel::TensorLayout::kHWC) .value(CHW, open_spiel::TensorLayout::kCHW);两种布局的索引顺序分别为布局索引顺序说明TensorLayout.CHW(channels, height, width)通道维度在最外层空间维度在最后与多数深度学习框架如 PyTorch 的 NCHW 约定一致TensorLayout.HWC(height, width, channels)空间维度在前通道维度在最后与图像处理常见的 NHWC 约定一致默认值是 CHWGame基类的虚函数ObservationTensorLayout()默认返回TensorLayout::kCHWopen_spiel/spiel.h。从集成测试 playthrough 记录来看绝大多数游戏都沿用该默认值例如井字棋、围棋、五子棋、国际象棋等。需要特别指出的是绝大多数游戏返回 CHW但实际张量通常是 1-D 或 2-D 的此时布局只是名义约定见下文第三节。真正以 3-D 张量返回观测的游戏其维度顺序才需要严格对照布局解读。目前仓库源码中显式覆盖并返回TensorLayout::kCHW的游戏包括 open_spiel/games/go/go.h 和 open_spiel/games/phantom_go/phantom_go.h 等仓库内尚无返回kHWC的游戏实例。三、配套接口shape 与 size 的组合使用原文档明确指出observation_tensor_layout()的用途是在根据game.observation_tensor_shape()给定的形状解读state.observation_tensor()返回的扁平向量时确定维度顺序。因此它必须与下面两个接口配套理解详见 docs/api_reference/game_observation_tensor_shape_size.mdobservation_tensor_shape()返回观测张量各维度大小的整数列表observation_tensor_size()返回观测张量所需扁平向量的总元素数。这两个接口在 open_spiel/spiel.h 中的实现如下virtual std::vectorint ObservationTensorShape() const { SpielFatalError(ObservationTensorShape unimplemented.); } virtual TensorLayout ObservationTensorLayout() const { return TensorLayout::kCHW; } // The size of the (flat) vector needed for the observation tensor-like format. int ObservationTensorSize() const { std::vectorint shape ObservationTensorShape(); return shape.empty() ? 0 : absl::c_accumulate(shape, 1, std::multipliesint()); }可见ObservationTensorSize()就是 shape 各维度值的连乘积shape 为空时为 0。三者的关系可以总结为observation_tensor_size() prod(observation_tensor_shape())四、实战示例一Leduc Poker 的 1-D 观测原文档给出的示例是 Leduc Poker。下面逐行验证其输出并补充更完整的可运行脚本import pyspiel game pyspiel.load_game(leduc_poker) print(game.observation_tensor_layout()) # TensorLayout.CHW print(game.observation_tensor_shape()) # [16]以默认参数2 人、suit_isomorphism加载时Leduc 的观测张量是一维的长度为 16布局名义上为 CHW。这个形状由 open_spiel/games/leduc_poker/leduc_poker.cc 计算得到std::vectorint LeducGame::ObservationTensorShape() const { // One-hot encoding for player number (who is to play). // 2 slots of cards (total_cards_ bits each): private card, public card // Followed by the contribution of each player to the pot if (suit_isomorphism_) { return {(num_players_) (total_cards_) (num_players_)}; } else { return {(num_players_) (total_cards_ * 2) (num_players_)}; } }即 2轮到谁行动的 one-hot 6total_cards_ 6两轮卡牌槽位 2两名玩家各自的底池贡献16。这些编码段在扁平向量中按声明顺序依次排列解读时可参考 open_spiel/games/leduc_poker/leduc_poker.h 中的接口声明。再看完整的三接口组合用法import pyspiel game pyspiel.load_game(leduc_poker) state game.new_initial_state() layout game.observation_tensor_layout() # TensorLayout.CHW shape game.observation_tensor_shape() # [16] size game.observation_tensor_size() # 16 print(layout, shape, size) print(state.observation_tensor()) # 16 个元素的扁平向量注意对于 1-D 观测向量[16]只有一个维度CHW 只是名义上的布局值不存在实际的 H/W/C 拆分。五、实战示例二Tic-Tac-Toe 的真 3-D 观测与 Leduc 不同井字棋tic_tac_toe的观测是真正的 3-D 张量此时布局才有实际的索引语义。playthrough 记录 open_spiel/integration_tests/playthroughs/tic_tac_toe.txt 给出的基准输出为ObservationTensorShape() [3, 3, 3] ObservationTensorLayout() TensorLayout.CHW ObservationTensorSize() 27即 shape 为(channels3, height3, width3)。其中 3 个通道分别表示X 棋子位置、O 棋子位置、空位每个通道是一张 3×3 的棋盘平面。这与 playthrough 中打印的观测张量可视化一致三个 3×3 平面并排显示见同一文件的ObservationTensor(0)段落。对应 Python 代码import pyspiel game pyspiel.load_game(tic_tac_toe) print(game.observation_tensor_layout()) # TensorLayout.CHW print(game.observation_tensor_shape()) # [3, 3, 3] print(game.observation_tensor_size()) # 27 state game.new_initial_state() obs state.observation_tensor() # 长度为 27 的扁平向量 # 按 CHW 布局重塑为 (C, H, W) import numpy as np tensor np.array(obs).reshape(game.observation_tensor_shape()) # tensor[0] X 平面, tensor[1] O 平面, tensor[2] 空位平面如果某个游戏的布局是 HWC则应将扁平向量重塑为(H, W, C)。布局不同重塑的 reshape 顺序就不同——这就是为什么在写与具体游戏解耦的通用 RL 代码时必须动态读取observation_tensor_layout()而不是硬编码维度顺序。六、跨游戏视角从 playthrough 看布局的多样性OpenSpiel 的集成测试为每个注册游戏生成 playthrough 记录由 open_spiel/python/algorithms/generate_playthrough.py 自动输出ObservationTensorShape() / ObservationTensorLayout() / ObservationTensorSize()三行基准信息是查询任意游戏观测约定的最权威参考。以下是从 open_spiel/integration_tests/playthroughs 中抽取的几个典型例子游戏ShapeLayoutSize说明tic_tac_toe[3, 3, 3]CHW27真 3-DC3 通道对应 X/O/空amazons[4, 10, 10]CHW400真 3-D4 通道 × 10×10 棋盘antichess[16, 8, 8]CHW1024真 3-D16 通道 × 8×8 棋盘breakthrough[3, 8, 8]CHW192真 3-D3 通道 × 8×8 棋盘2048[4, 4]CHW162-D按单空间维 通道维解释catch[10, 5]CHW502-Dleduc_poker[16]CHW161-D纯扁平编码blackjack[189]CHW1891-D可以看到3-D 观测如 amazons、antichess、breakthrough通常对应通道平面叠加式的棋盘编码此时 CHW 布局决定重塑顺序至关重要2-D 观测如 2048、catch按源码注释约定解释为一个空间维度 通道维度1-D 观测如各种扑克、桥牌、21 点是纯扁平编码布局仅为名义值解读时只需按 shape 与文档化的分段布局展开。七、与信息状态张量布局的对照OpenSpiel 的 API 家族中还有一个孪生接口information_state_tensor_layout()open_spiel/spiel.h其默认值同样是kCHWPython 绑定见 open_spiel/python/pybind11/pyspiel.cc。二者的语义完全对称观测张量observation tensorstate.observation_tensor()的解读依据信息状态张量information state tensorstate.information_state_tensor()的解读依据仅当GameType.provides_information_state_tensor为 True 时可用。信息状态关注的是某玩家视角下的不完全信息如自己手里的牌 公共信息而观测张量通常对应全局状态的部分可观测编码。在设计算法时需要根据任务选择正确的张量类型并各自读取其 shape 与 layout。八、实践要点与排查建议通用代码务必动态查询不要假设所有游戏都是 CHW。虽然当前仓库中绝大多数游戏默认 CHW但布局是每个游戏可覆盖的虚函数写可复用的 RL/神经网络代码时应通过game.observation_tensor_layout()动态获取再按对应顺序 reshape。size 必须等于 shape 的连乘积game.observation_tensor_size()是扁平向量的长度也是len(state.observation_tensor())的期望值两者不一致通常说明游戏实现有误或参数不匹配。2-D / 3-D 的解释规则3-D 按(C, H, W)或(H, W, C)解读2-D 按单空间维 通道维解读更高维没有标准避免依赖未定义行为。查阅 playthrough 基准对任意游戏直接在 open_spiel/integration_tests/playthroughs 目录下打开对应game.txt前三行即给出权威的 shape / layout / size 基准输出。自定义新游戏时若观测编码是多通道棋盘务必在Game子类中同时实现ObservationTensorShape()与ObservationTensorLayout()保证二者自洽并用 playthrough 测试验证生成方式参考 open_spiel/python/algorithms/generate_playthrough.py。总结observation_tensor_layout()是 OpenSpiel 观测张量 API 中承上启下的关键接口它连接了扁平的一维返回向量与带维度的张量语义直接决定 reshape 的维度顺序。理解 CHW/HWC 约定、与observation_tensor_shape()/observation_tensor_size()的配套关系以及 1-D/2-D/3-D 观测各自的解释规则是在 OpenSpiel 中正确构建基于观测的强化学习与神经网络管线的必要前提。更多相关方法可参考 docs/api_reference.md 中的 Core API 文档。赞分享人工智能强化学习深度学习【免费下载链接】open_spielOpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games.项目地址https://gitcode.com/gh_mirrors/op/open_spiel点击查看免费下载相关推荐OpenSpiel 张量布局TensorLayout完全指南解读 information_state_tensor_layout 与 CHW/HWC 语义OpenSpiel 张量布局TensorLayout完全指南解读 information_state_tensor_layout 与 CHW/HWC 语义人工智能强化学习深度学习TVM TIRx 张量布局Layout详解从 S/R/O 规格到 TMEM 与 SMEM 布局实战TVM TIRx 张量布局Layout详解从 S/R/O 规格到 TMEM 与 SMEM 布局实战 导读 TIRx 是 TVM 中面向现代加速器尤其是模型编译深度学习推理引擎3种方法彻底告别网易云音乐灰色歌曲解锁海外限制与版权屏障3种方法彻底告别网易云音乐灰色歌曲解锁海外限制与版权屏障 你是否也曾面对网易云音乐里那些灰色的歌曲列表感到无奈那些因为版权限制或地域封锁而无法播放的音乐就网络后端上一篇use-gesture依赖管理peerDependencies设置下一篇gh_mirrors/re/rebase安全配置指南保护代码仓库的5个关键步骤创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考