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
相关产品推荐
相关产品推荐

