Ошибка типа: невозможно преобразовать тензор CUDA в numpy. Используйте Tensor.cpu (), чтобы сначала скопировать тензор в память хоста (fastai) - PullRequest
1 голос
/ 15 апреля 2020

Я использую следующий код:

https://www.kaggle.com/tanlikesmath/diabetic-retinopathy-with-resnet50-oversampling

Однако при расчете метрик я получаю следующую ошибку:

File "main.py", line 50, in <module>
 learn.fit_one_cycle(4,max_lr = 2e-3)
...
File "main.py", line 39, in quadratic_kappa
    return torch.tensor(cohen_kappa_score(torch.argmax(y_hat,1), y, weights='quadratic'),device='cuda:0')
...
File "/pfs/work7/workspace/scratch/ul_dco32-conda-0/conda/envs/resnet50/lib/python3.8/site-packages/torch/tensor.py", line 486, in __array__
    return self.numpy()
TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

Вот метрики и модель:

def quadratic_kappa(y_hat, y):
    return torch.tensor(cohen_kappa_score(torch.argmax(y_hat,1), y, weights='quadratic'),device='cuda:0')

learn = cnn_learner(data, models.resnet50, metrics = [accuracy,quadratic_kappa])
learn.fit_one_cycle(4,max_lr = 2e-3)

Как уже говорилось в обсуждении https://discuss.pytorch.org/t/typeerror-can-t-convert-cuda-tensor-to-numpy-use-tensor-cpu-to-copy-the-tensor-to-host-memory-first/32850/6, я должен вернуть данные к cpu. Но я немного растерялся, как это сделать.

Я пытался добавить .cpu() по всем показателям, но пока не смог решить.

1 Ответ

1 голос
/ 16 апреля 2020

Я предполагаю, что и y, и y_hat являются тензорами CUDA, это означает, что вам нужно перенести их оба в ЦП для cohen_kappa_score, а не только для одного.

def quadratic_kappa(y_hat, y):
    return torch.tensor(cohen_kappa_score(torch.argmax(y_hat.cpu(),1), y.cpu(), weights='quadratic'),device='cuda:0')
    #                                                        ^^^         ^^^

Вызов .cpu() для тензора, который уже находится на ЦП, не имеет никакого эффекта, поэтому его можно использовать в любом случае.

...