You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity ML-Agent运行3Dball时ConcatV2报错:values列表长度不足2

解决Unity ML-Agent 3Dball场景训练时的ConcatV2 ValueError问题

我之前也踩过一模一样的坑——在Unity ML-Agent里跑3Dball场景,加载环境全程顺畅,但一执行训练步骤就突然炸锅,抛出ValueError: List argument 'values' to 'ConcatV2' Op with length 0 shorter than minimum length 2。看了你贴的官方PPO.ipynb代码,这个问题本质是模型输入的张量拼接逻辑出了问题,下面给你几个亲测有效的解决思路:

先查Unity端的Brain配置(最常见原因)

打开3Dball场景里的Brain组件(一般挂在Academy或者Agent对象上),重点检查这两个参数:

  • Number of Observations:3Dball默认用摄像头做视觉观测,这个值必须大于0(默认是1),如果被改成0了,代码里use_observations会变成False
  • State Space Size:3Dball不需要额外的状态输入,这个值要设为0,要是不小心改成非0但又没实际传状态,也会出问题

如果这两个参数同时为0,代码里准备拼接的观测/状态张量列表就会是空的,直接触发ConcatV2的错误。

给代码加个输入合法性检查

要是Unity配置没问题,那就在create_agent_model函数的输入拼接部分加个判断,提前拦截空列表的情况:

# 找到构建模型输入的代码段,比如处理observation_in和state_in的地方
input_tensors = []
if use_observations:
    input_tensors.extend(ppo_model.observation_in)
if use_states:
    input_tensors.append(ppo_model.state_in)

# 加个判断,避免空列表进入ConcatV2
if len(input_tensors) < 1:
    raise ValueError("模型没有获取到任何观测或状态输入!请检查Unity Brain配置")
# 如果代码逻辑默认需要至少2个输入(比如观测+状态),就把判断改成len(input_tensors) < 2
concatenated_input = tf.concat(input_tensors, axis=1)

这样能提前抛出更明确的错误,不用等到TensorFlow执行拼接时才崩溃。

确认Brain名称完全匹配

检查代码里的brain_name变量,确保和Unity场景里Brain组件的Brain Name完全一致(大小写、空格都不能错)。如果名称不匹配,env.brains[brain_name]拿到的是无效配置,number_observations和state_space_size都会是0,自然会触发拼接错误。

重置环境缓存

有时候环境初始化时的缓存会导致配置读取异常,你可以在训练前先销毁旧环境再重建:

# 先关闭旧环境(如果存在)
if 'env' in locals():
    env.close()
# 重新创建3Dball环境
env = UnityEnvironment(file_name="3DBall")
# 取第一个Brain的名称(确保和Unity里的一致)
brain_name = env.brain_names[0]

一般按这个顺序排查,很快就能解决问题。

内容的提问来源于stack exchange,提问作者deepsigner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:46