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

PyTorch绘图报错can't convert cuda:0 tensor to numpy问题排查

问题定位

报错根源是train_epoch、eval_model两个函数返回的准确率值是CUDA设备上的PyTorch张量。matplotlib执行plt.plot时会自动将传入对象转为numpy数组,但CUDA张量无法直接转换为numpy数组,必须先拷贝到主机内存才能做转换。
具体来说,两个函数里累加得到的correct_predictions是CUDA张量,执行correct_predictions.double() / n_examples后的结果仍然驻留在CUDA显存中,没有被转换为CPU端的普通数值,存入history列表后传入绘图接口就触发了报错。而loss值因为用了.item()提取标量,np.mean(losses)返回的是普通浮点值,不会触发该问题。

修复方案

二选一即可:

  • 方案1:在训练、验证函数返回时直接将准确率转为CPU端原生数值
    修改两个函数的return语句,补充.cpu().item()将单元素张量转为Python原生浮点数:
    # train_epoch函数的返回行修改为
    return correct_predictions.double().cpu().item() / n_examples, np.mean(losses)
    
    # eval_model函数的返回行修改为
    return correct_predictions.double().cpu().item() / n_examples, np.mean(losses)
    
  • 方案2:在记录训练历史时转换张量
    不修改训练、验证逻辑,在往history存值时做转换:
    history['train_acc'].append(train_acc.cpu().item())
    history['train_loss'].append(train_loss)
    history['val_acc'].append(val_acc.cpu().item())
    history['val_loss'].append(val_loss)
    

修改完成后重新运行绘图代码即可正常生成准确率变化曲线,不会再触发设备类型不匹配的TypeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:15:46