将NumPy数组正确转换为在GPU上运行的PyTorch张量

3
我已经创建了一个类似于这样的DataLoader数据加载器。
class ToTensor(object):
    def __call__(self, sample):
        return torch.from_numpy(sample).to(device)

class MyDataset(Dataset):
    def __init__(self, data, transform=None):
        self.data = data
        self.transform = transform

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        sample = self.data[idx, :]

        if self.transform:
            sample = self.transform(sample)

        return sample

我将使用此数据加载器,如下所示。
dataset = MLBDataset(
        data=data,
        transform=transforms.Compose([
            ToTensor()
        ]))
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4)
dataiter = iter(dataloader)
x = dataiter.next()

这会失败并显示以下信息

THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/THCGeneral.cpp line=55 error=3 : initialization error
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/THCGeneral.cpp line=55 error=3 : initialization error
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/THCGeneral.cpp line=55 error=3 : initialization error
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/THCGeneral.cpp line=55 error=3 : initialization error
...
    torch._C._cuda_init()
RuntimeError: cuda runtime error (3) : initialization error at /opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/THCGeneral.cpp:55

ToTensor()中的return命令中,实际上任何尝试将张量移动到GPU内部的尝试都会失败。我已经尝试过以下操作:
a = np.array([[[1, 2, 3, 4], [5, 6, 7, 8], [25, 26, 27, 28]],
             [[11, 12, np.nan, 14], [15, 16, 17, 18], [35, 36, 37, 38]]])
print(torch.from_numpy(a).to(device))

ToTensor()__call__ 函数中出现错误,并且显示相同的错误消息,但在其他地方都能成功运行。
为什么会出现这个错误并如何解决?

请查看https://github.com/pytorch/pytorch/issues/1666,看看apaszke的回答。 - trsvchn
首先检查CUDA是否可用: import torch x = torch.randn(2, 2, device='cuda:0') print(x) - trsvchn
@TarasSavchyn 我认为CUDA没有问题,至少对于我进行的任何其他测试都是如此。 - dearn44
我明白了,也许可以尝试这个:X = torch.from_numpy(X).cuda("cuda:0") - trsvchn
@TarasSavchyn,我完全重写了这个问题,希望让它更清晰明了了。不幸的是,并不是因为缺少正确的“设备”而出现问题。 - dearn44
2个回答

1
尝试这个:
代码:
import numpy as np
import torch
import torch.nn as nn

torch.cuda.set_device(0)

X = np.ones((1, 10), dtype=np.float32)
print(type(X), X)
X = torch.from_numpy(X).cuda(0)
print(type(X), X)

model = nn.Linear(10, 10).cuda(0)
Y = model(X)
print(type(Y), Y)

输出:

<class 'numpy.ndarray'> [[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
<class 'torch.Tensor'> tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], device='cuda:0')
<class 'torch.Tensor'> tensor([[ 0.4867, -1.0050,  0.4872, -0.0260, -0.0788,  0.0161,  1.2210, -0.3957,
          0.2097,  0.2296]], device='cuda:0', grad_fn=<AddmmBackward>)

1
根据 链接 ,这可能与多进程问题有关。您可以找到以下 解决方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接