[教训贴]Pytorch中使用tensorboard报错NotImplementedError: Got <class ‘dict‘>, but numpy array, torch tensor

报错信息:
NotImplementedError: Got <class ‘dict’>, but numpy array, torch tensor, or caffe2 blob name are expected.
报错信息

报错原因:
writer.add_scalars要加“S”
单个变量的可视化是不用加s的,例如:

  • writer.add_scalar(‘test_acc’, test_acc, test_step)
    多个变量共同可视化就要加S,例如:
  • writer.add_scalars(
    ‘epoch_loss’,
    {
    ‘train’: np.mean(train_loss_lis),
    ‘test’: np.mean(test_loss_lis)
    },
    epoch
    )
    最终生成的效果图:
    在这里插入图片描述
    分析:就是自己太不仔细了,也太依赖编译器,出来啥就点啥了
这个错误表明你在尝试将一个位于CUDA设备(GPU)上的PyTorch张量直接转换为NumPy数组,但NumPy无法处理GPU上的张量。具体来说,错误发生在`stdAgent.py`的第143行,你试图对一个CUDA张量调用`.detach().numpy()`,但必须先将其移动到CPU。 ### **错误原因分析** 1. **CUDA张量无法直接转换为NumPy数组**: - PyTorch张量位于GPU(`cuda:0`)时,不能直接调用`.numpy()`方法。 - 必须先调用`.cpu()`将张量移动到CPU,再调用`.numpy()`。 2. **错误位置**: - 在`stdAgent.py`的第143行,你尝试对`transition_dict['actions']`中的每个张量调用`.detach().numpy()`,但这些张量可能已经在GPU上。 --- ### **解决方法** #### **1. 修复CUDA张量转换问题** 在将张量转换为NumPy数组之前,确保它们位于CPU上: ```python # 错误方式(直接对CUDA张量调用.numpy()) # actions = torch.tensor([item.detach().numpy() for item in transition_dict['actions']]).to(self.device) # 正确方式:先移动到CPU,再转换为NumPy actions = torch.tensor([item.detach().cpu().numpy() for item in transition_dict['actions']]).to(self.device) ``` #### **2. 避免不必要的NumPy转换** 如果`transition_dict['actions']`已经是PyTorch张量,可以直接使用它们,而不需要转换为NumPy再转回PyTorch: ```python # 更高效的方式:直接拼接张量,避免NumPy转换 actions = torch.cat(transition_dict['actions']).to(self.device) ``` #### **3. 检查`transition_dict`的来源** 确保`transition_dict['actions']`中的张量是从CPU收集的,或者在收集时已经移动到CPU: ```python # 在收集transition时,确保动作张量在CPU上 transition = { 'state': state.cpu(), 'action': action.cpu(), # 确保动作在CPU上 'reward': reward, 'next_state': next_state.cpu(), 'done': done } transition_dict['actions'].append(transition['action']) ``` --- ### **4. 完整修复示例** 假设你的代码在`stdAgent.py`的`update`方法中: ```python def update(self, transition_dict): # 修复:确保所有张量在CPU上再转换为NumPy actions = torch.tensor([item.detach().cpu().numpy() for item in transition_dict['actions']]).to(self.device) # 或者更高效的方式:直接拼接张量 # actions = torch.cat(transition_dict['actions']).to(self.device) # 继续后续逻辑... ``` --- ### **5. 调试建议** - 在出错位置打印`transition_dict['actions'][0].device`,确认它们是否在GPU上。 - 如果动作张量不需要转换为NumPy,直接使用PyTorch操作(如`torch.cat`)会更高效。 --- ### **总结** 1. **CUDA张量转换**: - 使用`.cpu()`将张量移动到CPU,再调用`.numpy()`。 - 示例:`tensor.cpu().numpy()`。 2. **避免不必要的NumPy转换**: - 如果已经是PyTorch张量,优先使用PyTorch操作(如`torch.cat`)。 3. **检查数据流**: - 确保在收集`transition_dict`时,动作张量位于CPU上。 --- ### **相关问题** 1. 如何高效地拼接PyTorch张量列表? 2. `torch.cat`和`torch.stack`有什么区别? 3. 为什么PyTorch张量在GPU上时不能直接转换为NumPy? 4. 如何在强化学习中避免频繁的CPU-GPU数据传输? 5. 如何调试PyTorch张量的设备位置(CPU/GPU)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值