运行时错误:输入类型(割炬.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同



This:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
for data in dataloader:
inputs, labels = data
outputs = model(inputs)

给出错误:

运行时错误:输入类型(割炬。FloatTensor(和权重类型(torch.cuda.FloatTensor(应该相同

您收到此错误是因为您的模型位于 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 上,但您的模型权重不在,则会引发相同的错误。在这种情况下,您需要将模型权重发送到 GPU。

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

请参阅文档以了解cuda()及其相反的cpu()

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

优势是显而易见和重要的。 您的设备明天可能不是"cuda":

  • 中央处理器
  • 库达
  • 姆克尔德恩
  • OpenGL
  • OpenCL
  • 伊迪普
  • 臀部
  • MSNPU
  • 西拉

所以尽量避免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)

正如前面的答案中已经提到的,问题可能是您的模型是在 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 上(。

加载模型时,权重和输入必须位于同一设备中,我们可以通过使用其他人指出的.to(device)来做到这一点。

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

model = torch.load(PATH).type(torch.FloatTensor).to(device)
input = input.type(torch.FloatTensor).to(device)

请注意(来自 pytorch 文档(:

如果 self 张量已经具有正确的 torch.dtype 和 torch.device,则返回 self。否则,返回的张量是具有所需 torch.dtype 和 torch.device 的 self 副本。

也就是说,您可能需要执行以下操作:

model = model.to("cuda")
data = data.to("cuda")

而不仅仅是:

model.to("cuda")
data.to("cuda")

使用第一种方法,您将处于安全的一面。

* 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()

首先检查 cuda 是否可用:

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

如果您想加载某些模型,请执行以下操作:

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

现在您可能会收到此错误:

运行时错误:输入类型(割炬。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()
x = x.to(device, dtype=torch.float32)
y = y.to(device, dtype=torch.float32)

工作,完全没问题...

相关内容

最新更新