【问题标题】:PyTorch RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the samePyTorch RuntimeError:输入类型(torch.cuda.FloatTensor)和权重类型(torch.FloatTensor)应该相同
【发布时间】:2021-11-03 21:56:49
【问题描述】:

我找到了很多关于这个主题的答案,但没有一个有帮助。

错误是

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

训练循环

model = BrainModel()
model.to(device)
loss_function = nn.BCELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

for epoch in range(EPOCHS):
    for sequences, labels in train_dataloader:
        optimizer.zero_grad()
        labels = labels.view(BATCH_SIZE, -1)
        sequences, labels = sequences.to(device), labels.view(BATCH_SIZE, -1).to(device)
        print(next(model.parameters()).is_cuda, sequences.get_device(), labels.get_device())
        out = model(sequences) # ERROR HERE
        out, labels = out.type(torch.FloatTensor), labels.type(torch.FloatTensor)
        loss = loss_function(out, labels)
        loss.backward()
        optimizer.step()

你可以在循环中看到一个打印,它的输出是:

True 0 0

这意味着所有——模型、x 和 y——都在 cuda 上。当我使用 CPU 而不是 GPU 时,相同的代码运行良好。我不明白还有什么需要转移到device。我总是按照我在这里的方式编写它,它总是运行良好:C

【问题讨论】:

    标签: python deep-learning pytorch


    【解决方案1】:

    您还需要将labels 传输到CUDA 设备以计算loss

    loss = loss_function(out, labels.to(device))
    

    【讨论】:

    • 感谢您的回答!已经在这些方面做到了:python labels = labels.view(BATCH_SIZE, -1) sequences, labels = sequences.to(device), labels.view(BATCH_SIZE, -1).to(device)
    【解决方案2】:

    需要这样做:使用nn.ModuleList而不是python列表

            self.convolutions1 = nn.ModuleList([nn.Conv2d(1, 3, 5, 2, 2) for _ in range(sequence_size)])
            emb_dim = calc_embedding_size(self.convolutions1[0], input_size)
            self.convolutions2 = nn.ModuleList([nn.Conv2d(3, 6, 3, 1, 0) for _ in range(sequence_size)])
            emb_dim = calc_embedding_size(self.convolutions2[0], emb_dim)
            self.convolutions3 = nn.ModuleList([nn.Conv2d(6, 9, 5, 1, 0) for _ in range(sequence_size)])
            emb_dim = calc_embedding_size(self.convolutions3[0], emb_dim)
    

    在 GPU 上训练时使用torch.cuda.FloatTensor

    out, labels = out.type(torch.cuda.FloatTensor), labels.type(torch.cuda.FloatTensor)
    

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2023-03-27
      • 2020-09-29
      • 2021-01-03
      • 2022-11-11
      • 2021-12-30
      • 2021-12-06
      • 2021-07-18
      • 2023-04-10
      相关资源
      最近更新 更多