You need to enable JavaScript to run this app. Mac系统下创建PyTorch神经网络触发CUDA错误的解决求助
优惠活动
大模型
产品
解决方案
定价
更多

Mac系统下创建PyTorch神经网络触发CUDA错误的解决求助

错误原因

你触发CUDA报错的核心原因是nn.Linear(*input_dims, 256)的传参逻辑存在错误,和输入维度本身、Mac设备无CUDA硬件没有直接关联:
nn.Linear的合法位置参数仅2个必填项:in_features(输入特征的最后一维大小)、out_features(输出特征的最后一维大小),后续可选位置参数依次为bias(布尔值,是否启用偏置)、device(张量存储的设备标识)、dtype(张量数据类型)。

  • 当你传入input_dims=(100,100)时,*input_dims解包为100, 100,加上后面的256,总共给nn.Linear传了3个位置参数,对应in_features=100、out_features=100、bias=256。这里256会被Python隐式转换为布尔值True,刚好符合bias参数的类型要求,所以没有触发报错(但此时你的逻辑已经不符合预期:你本来希望第一层全连接输出维度是256,实际输出维度是100)。
  • 当你传入input_dims=(100,100,3)时,*input_dims解包为100,100,3,加上后面的256,总共传了4个位置参数,对应in_features=100、out_features=100、bias=3(转布尔值True)、device=256。PyTorch会把整数类型的device参数识别为cuda:256,但Mac版PyTorch默认没有编译CUDA支持,直接触发了你看到的报错。
修复方案

根据你的业务需求选择对应修复方式即可:

  • 如果你希望全连接层仅作用在输入的最后一维,不需要合并其他维度,直接将第一层写法改为:
nn.Linear(input_dims[-1], 256)
  • 如果你希望把多维度的输入(比如(100,100,3)的三维图像特征)全部展平为一维后再喂给全连接层,参考如下修改后的代码:
import torch as T
import torch.nn as nn

def create(input_dims):
    return nn.Sequential(
                # 展平批次维度外的所有维度,比如(100,100,3)会展平为100*100*3=30000维
                nn.Flatten(),
                # 自动计算展平后的总维度作为输入特征数
                nn.Linear(T.prod(T.tensor(input_dims)).item(), 256),
                nn.ReLU(),
                nn.Linear(256, 256),
                nn.ReLU(),
                nn.Linear(256, 50),
                nn.Softmax(dim=-1)
    )

# 两种输入均可正常运行
create(input_dims=(100,100))
create(input_dims=(100,100,3))

额外提示:如果是处理图像类任务,全连接层会带来极高的参数量,更建议使用卷积层替代首层全连接层,避免维度爆炸。

内容的提问来源于stack exchange,提问作者TheDarBear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:30:05