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

