You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:03