2017-09-01 102 views
1

在我訓練PyTorch模型的推理代碼中,出了什麼問題?PyTorch的「期望的CPU張量(得到CUDA張量)」錯誤

有一個運行時錯誤信息: 「預計CPU張量(GOT CUDA張量)」


import torch 
import torch.nn as nn 
#from __future__ import print_function 
import argparse 
from PIL import Image 
import torchvision.models as models 
import skimage.io 
from torch.autograd import Variable as V 
from torch.nn import functional as f 
from torchvision import transforms as trn 


# define image transformation 
centre_crop = trn.Compose([ 
trn.ToPILImage(), 
trn.Scale(256), 
trn.CenterCrop(224), 
trn.ToTensor(), 
trn.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) 
]) 

filename=r'ed91.png' 
img = skimage.io.imread(filename) 

x = V(centre_crop(img).unsqueeze(0), volatile=True) 

model = models.__dict__['resnet18']() 
model = torch.nn.DataParallel(model).cuda() 

model = torch.load('mw_model0831.pth') 
#model.load_state_dict(checkpoint['state_dict']) 

#best_prec1 = checkpoint['best_prec1'] 
logit = model(x) 

print(logit) 
print(len(logit)) 
h_x = f.softmax(logit).data.squeeze() 

我怎樣才能解決這個問題?

回答

0

可能錯誤是cuda 中的模型與您用作輸入的變量x之間的不匹配,這是CPU張量。

嘗試添加.cuda()到您的變量,都匹配:

x = V(centre_crop(img).unsqueeze(0), volatile=True).cuda() 
0

的錯誤是因爲model是GPU,而你的輸入圖像x是CPU。你必須確保它們都在GPU或CPU上。

此外,model.cuda()x.cuda()表現略有不同:model.cuda()將放在GPU的model,但x.cuda()只返回一個新的變量上的GPU,離開原來的x不變。您必須明確指定返回值爲x

你可以找到詳細的討論here