RuntimeError: 输入类型(torch.Cuda. FloatTensor)和权重类型(torch.Cuda. FloatTensor)应该是相同的

这个:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)


for data in dataloader:
inputs, labels = data
outputs = model(inputs)

给出了错误:

RuntimeError: 输入类型(torch.Cuda. FloatTensor)和权重类型(torch.Cuda. FloatTensor)应该是相同的

193252 次浏览

你得到这个错误是因为你的模型在 GPU 上,但是你的数据在 CPU 上。所以,你需要把你的输入张量发送到 GPU。

inputs, labels = data                         # this is what you had
inputs, labels = inputs.cuda(), labels.cuda() # add this line

或者像这样,保持与代码的其余部分一致:

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


inputs, labels = inputs.to(device), labels.to(device)

如果你的输入张量在图形处理器上,而你的模型权重不在,那么 同样的错误就会升高。在这种情况下,您需要将模型权重发送到 GPU。

model = MyModel()


if torch.cuda.is_available():
model.cuda()

请参阅有关 cuda()及其对立面 cpu()的文档。

首先检查是否可以使用 Cuda:

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

如果你想加载一些模型,这样做:

  checkpoint = torch.load('./generator_release.pth', map_location=device)
G = Generator().to(device)

现在你可能会得到这个错误:

RuntimeError: 输入类型(torch.Cuda. FloatTensor)和权重类型(torch.Cuda. FloatTensor)应该是相同的

需要通过以下方法将输入数据类型从 torch.tensor 转换为 torch.cuda.tensor:

if torch.cuda.is_available():
data = data.cuda()
result = G(data)

然后将结果从 torch.cuda.tensor 转换为 torch.tensor:

if torch.cuda.is_available():
result = result.cpu()

正如在前面的答案中已经提到的,问题可能是您的模型是在 GPU 上训练的,但它是在 CPU 上测试的。如果是这样的话,那么你需要像这样把模型的权重和数据从 GPU 移植到 CPU 上:

device = args.device # "cuda" / "cpu"
if "cuda" in device and not torch.cuda.is_available():
device = "cpu"
data = data.to(device)
model.to(device)

注意: 这里我们仍然检查配置参数是否设置为 GPU 或 CPU,以便这段代码既可以用于(在 GPU 上的)培训,也可以用于(在 CPU 上的)测试。

新的 API 将使用 .to()方法。

优势是显而易见和重要的。 你的设备明天可能不再是“ Cuda”了:

  • 中央处理器
  • Cuda
  • 我不知道
  • OpenGl
  • 开门
  • 很深刻
  • 时髦
  • Msnpu
  • Xla

所以尽量避免 model.cuda() 检查设备没有错

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

或者硬编码:

dev=torch.device("cuda")

与:

dev="cuda"

一般情况下,您可以使用以下代码:

model.to(dev)
data = data.to(dev)
   * when you get this error::RuntimeError: Input type
(torch.FloatTensor) and weight type (torch.cuda.FloatTensor should
be the same
# Move tensors to GPU is CUDA is available
# Check if CUDA is available


train_on_gpu = torch.cuda.is_available()


If train_on_gpu:
print("CUDA is available! Training on GPU...")
else:
print("CUDA is not available. Training on CPU...")


-------------------
# Move tensors to GPU is CUDA is available
if train_on_gpu:


model.cuda()

我也有同样的问题,我的 CNN 模特:

class CNN(nn.Module):
def __init__(self):
super(CNN,self).__init__()
self.device = torch.device(device)
self.dummy_param = nn.Parameter(torch.empty(0))
l1 = nn.Conv2d(3, 64,    kernel_size=(3, 3), stride=(1, 1), padding= (1,1)).to(device)
l2 = nn.Conv2d(64, 128,  kernel_size=(3, 3), stride=(1, 1), padding=(1,1)).to(device)
l3 = nn.Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)).to(device)
l4 = nn.Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)).to(device)
l5 = nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)).to(device)
self.layers = [l1,l2,l3,l4,l5]
self.layers = [l1,l2]


def forward(self,x):
features = []
for l in self.layers:
  

x = l(x)
features.append(x)
return features

我把它的工作(装置)给我。

当加载一个模型时,权重和输入都必须在同一个设备中,我们可以使用 .to(device)来做到这一点,正如其他人所指出的那样。

然而,在这种情况下,保存的权值和输入张量的数据类型也可能是不同的。如果是这种情况,那么我们还必须改变模型权重和输入的数据类型:

model = torch.load(PATH).type(torch.FloatTensor).to(device)
input = input.type(torch.FloatTensor).to(device)
x = x.to(device, dtype=torch.float32)


y = y.to(device, dtype=torch.float32)

工作,完全没问题..。