PyTorch线性回归报mat1位于CPU预期在GPU错误如何解决
问题定位
你漏掉了测试集张量test_X_torch的CUDA迁移操作,这是触发报错的根本原因:
你的模型已经通过model.to(device)迁移到GPU上,但在函数返回时调用model(test_X_torch.float())推理,传入的test_X_torch是直接从CPU侧传入的,没有同步迁移到GPU,PyTorch要求参与运算的模型参数和输入张量必须在同一设备,因此触发了addmm算子的设备不匹配报错。
另外你的代码还存在一个笔误:loss = criterion(outputs, labels.)中labels后面多了一个多余的小数点,运行时也会触发语法错误,需要同步修正。
修复方案
修改fit_linear_reg函数的对应部分即可:
def fit_linear_reg(train_X_torch, train_y_torch, test_X_torch, case_type, fold_no, p_t): size_input = train_X_torch.shape[1] size_output = train_y_torch.shape[1] # 提前统一设备,避免重复判断CUDA是否可用 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = linear_regression(size_input, size_output) model.to(device) learningRate = 0.01 epochs = 1 criterion = torch.nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=learningRate) training_loss_list = [] for epoch in range(epochs): # 统一用.to(device)迁移张量,写法更简洁 inputs = Variable(train_X_torch.float().to(device)) labels = Variable(train_y_torch.float().to(device)) optimizer.zero_grad() outputs = model(inputs) # 修复labels后的多余小数点 loss = criterion(outputs, labels) loss.backward() optimizer.step() training_loss_list.append(loss.item()) torch.save(model.state_dict(), './results/weights_' + case_type + '_' + str(fold_no) + '_' + p_t) # 测试张量同步迁移到对应设备 test_input = test_X_torch.float().to(device) return (model(test_input), training_loss_list)
另外你后续把预测结果转numpy数组时,需要先把GPU上的张量移回CPU,否则会触发新的设备不匹配错误,修改对应代码:
preds_case[k_test_index, :] = preds.detach().cpu().numpy()
内容的提问来源于stack exchange,提问作者Kadaj13
相关产品推荐
相关产品推荐

