在xuance/common/memory_tools_marl.py中第200行到207行,以下区域
if use_value_norm:
vs_t, vs_next = value_normalizer[key_vn].denormalize(vs[t]), value_normalizer[
key_vn].denormalize(vs[t + 1])
else:
vs_t, vs_next = vs[t], vs[t + 1]
delta = rewards[t] + (1 - dones[t]) * self.gamma * vs_next - vs_t
last_gae_lam = delta + (1 - dones[t]) * self.gamma * self.gae_lambda * last_gae_lam
returns[t] = last_gae_lam + vs_t
在1.4.0版本中,0维np.float32对象vs[t]会通过 xuance/torch/utils/value_norm.py 被denormalize升维成 一个二维的对象 vs_t, vs_next ,形如array([[0.]],dtype=np.float32),因此,last_gae_lam 形如 array([[0.]])。在mindspore、tf也有类似实现,相同的输入带来的输出内容、格式是相同的。
returns初始化为 np.zeros_like(rewards),对于 returns[t],它是一个np.float32 0维对象,因此按目前的实现赋值会报错。
我根据我自己的场景测试,本着最小影响面原则,添加 .reshape(-1)[0] 将vs_t, vs_next降维成np.float32 0维对象可解决问题,也不会有精度损失。请评估修改下,感谢!
在xuance/common/memory_tools_marl.py中第200行到207行,以下区域
在1.4.0版本中,0维
np.float32对象vs[t]会通过 xuance/torch/utils/value_norm.py 被denormalize升维成 一个二维的对象vs_t, vs_next,形如array([[0.]],dtype=np.float32),因此,last_gae_lam形如array([[0.]])。在mindspore、tf也有类似实现,相同的输入带来的输出内容、格式是相同的。returns初始化为np.zeros_like(rewards),对于returns[t],它是一个np.float320维对象,因此按目前的实现赋值会报错。我根据我自己的场景测试,本着最小影响面原则,添加
.reshape(-1)[0]将vs_t, vs_next降维成np.float320维对象可解决问题,也不会有精度损失。请评估修改下,感谢!