遵循Keras官网DDPG摆锤示例时遇张量转换错误求助
解决DDPG摆锤示例中张量转换的ValueError问题
问题根源
你使用的Gym 0.26.2版本存在API破坏性变更:
env.reset()返回值从单一观测数组变为(观测数组, 信息字典)的元组env.step(action)返回值从四元组(观测, 奖励, 是否结束, 信息)改为五元组(观测, 奖励, 是否终止, 是否截断, 信息)
若代码直接将env.reset()的完整返回值赋值给prev_state,或从step返回值中错误获取了多元素结构,会导致prev_state成为非矩形序列(如元组),无法被tf.convert_to_tensor正常转换。
修复方案
1. 修正env.reset()调用
旧版Gym的代码写法:
prev_state = env.reset()
改为仅提取观测数组:
prev_state, _ = env.reset()
2. 修正env.step()调用与终止判断
旧版Gym的代码写法:
state, reward, done, info = env.step(action)
改为适配新版API的写法:
state, reward, terminated, truncated, info = env.step(action) # 合并终止与截断条件,对应旧版的done done = terminated or truncated
3. 验证prev_state的有效性
在转换张量前,可打印prev_state的类型和形状确认:
print(type(prev_state), prev_state.shape)
正常输出应为类似 <class 'numpy.ndarray'> (3,)(Pendulum环境的观测为3维数组)。
4. 可选:强制转换为numpy数组
若仍有异常,可先将观测转为numpy数组再转张量:
import numpy as np tf_prev_state = tf.expand_dims(tf.convert_to_tensor(np.array(prev_state)), 0)
验证
修改后,tf.convert_to_tensor(prev_state)可将单一观测数组转换为张量,再通过tf.expand_dims添加批次维度,不会再触发非矩形序列的转换错误。
内容的提问来源于stack exchange,提问作者Vlad Nanu
相关产品推荐
相关产品推荐

