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
相关产品推荐
相关产品推荐

