这是我第二次遇到这个问题啦,昨天遇到一遍,今天又遇到了,又花了好半天才想起来为啥(气),所以滚来做笔记了。
RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same or input should be a MKLDNN tensor and weight is a dense tensor
首先这段话的意思是:
运行时异常:输入类型为 torch.FloatTensor ,而网络模型的权重类型为 torch.cuda.FloatTensor ,这二者需要保持一致,除非输入为MKLDNN tensor类型并且权重是 dense tensor。
后半句我暂时还不懂是啥意思哈哈,但前半句是说我们的网络模型加载到cuda中了,但是输入是在cpu中的,所以出问题了。
as we know,使用GPU加速训练需要调整网络模型、损失函数还有输入数据这三处,因此我们检查如下三处:
1. 网络模型
# 实例化模型
my_lenet5 = MyLeNet5()
my_lenet5.to(device)
没问题 √
2. 损失函数
# 损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn.to(device)
没问题 √
3. 输入数据
# 训练步骤
my_lenet5.train()
for data in train_dataloader:
imgs, labels = data
imgs.to(device)
labels.to(device)
有问题!
“网络模型、损失函数都不需要另外赋值,直接 .to(device) 就可以
但是数据(图片、标注)需要另外转移之后再重新赋值给变量 ”
所以要改成:
# 训练步骤
my_lenet5.train()
for data in train_dataloader:
imgs, labels = data
imgs = imgs.to(device)
labels = labels.to(device)
这样我的问题就解决啦!
红字标识的出处:
【我是土堆 - PyTorch教程】学习随手记(已更新 | 已完结 | 10w字超详细版)_如何原谅奋力过但无声的博客-CSDN博客
大佬这篇笔记做的超详细,推荐大家看。