'out' 的 Pytorch 张量在 CPU 上,参数 #1 'self' 的张量在 CPU 上,但希望它们在 GPU 上(同时检查 addmm 的参数)

Pytorch Tensor for 'out' is on CPU, Tensor for argument #1 'self' is on CPU, but expected them to be on GPU (while checking arguments for addmm)

我是机器学习的初学者,正在尝试训练一个模型来计算长度为 10 的一维向量中小于 0.5 的数字的数量。输入向量包含 0 到 1 之间的数字。我生成输入我的脚本中的数据和标签,而不是将它们放在单独的文件中,因为数据非常简单。 这是代码:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

class MyNet(nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        self.lin1 = nn.Linear(10,10)
        self.lin2 = nn.Linear(10,1)
        
    def forward(self,x):
        x = self.lin1(x)
        x = F.relu(x)
        x = self.lin2(x)
        return x

net = MyNet()
net.to(device)

def train():
    criterion = nn.MSELoss()
    optimizer = optim.SGD(net.parameters(), lr=0.1)
    for epochs in range(100):
        target = 0
        data = torch.rand(10)
        for entry in data:
            if entry < 0.5:
                target += 1
        # print(target)
        # print(data)
        data = data.to(device)

        out = net(data)
        # print(out)
    
        target = torch.Tensor(target)
        target = target.to(device)

        loss = criterion(out, target)
        print(loss)

        net.zero_grad()
        loss.backward()

        optimizer.step()

def test():
    acc_error = 0
    for i in range(100):
        test_data = torch.rand(10)
        test_data.to(device)
        test_target = 0
        for entry in test_data:
            if entry < 0.5:
                test_target += 1
        out = net(test_data)
        error = test_target - out
        if error < 0:
            error *= -1
        acc_error += error 
    
    overall_error = acc_error / 100

    print(overall_error)

train()
test() 

这是错误:

Traceback (most recent call last):
  File "test1.py", line 70, in <module>
    test()
  File "test1.py", line 59, in test
    out = net(test_data)
  File "/vol/fob-vol7/mi18/radtklau/SP/sem_project/lib64/python3.6/site-packages/torch/nn/modules/module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "test1.py", line 15, in forward
    x = self.lin1(x)
  File "/vol/fob-vol7/mi18/radtklau/SP/sem_project/lib64/python3.6/site-packages/torch/nn/modules/module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/vol/fob-vol7/mi18/radtklau/SP/sem_project/lib64/python3.6/site-packages/torch/nn/modules/linear.py", line 94, in forward
    return F.linear(input, self.weight, self.bias)
  File "/vol/fob-vol7/mi18/radtklau/SP/sem_project/lib64/python3.6/site-packages/torch/nn/functional.py", line 1753, in linear
    return torch._C._nn.linear(input, weight, bias)
RuntimeError: Tensor for 'out' is on CPU, Tensor for argument #1 'self' is on CPU, but expected them to be on GPU (while checking arguments for addmm)

关于该主题的其他帖子没有解决我的问题。也许有人可以提供帮助。谢谢!

请注意您的错误消息如何追溯到 test,而 train 工作正常。

您已在 train 中正确传输数据:

data = data.to(device)

但不在 test:

test_data.to(device)

相反,它应该重新分配给 test_data,因为 torch.Tensor.to 制作了一个副本:

test_data = test_data.to(device)