PyTorch项目报错Expected 2 or more dimensions (got 1)如何解决?
报错原因分析
直接触发维度错误的核心原因
- 输入张量维度缺失批次维度
你定义的输入Xs形状为(9, 2),逐元素遍历得到的单个样本x形状为(2,),属于1维张量。PyTorch的nn.Linear层默认预期输入格式为(批次大小, 特征数)的二维张量,即使是单样本输入也需要保留批次维度。 - 损失函数输入维度不符合要求
你调用的F.nll_loss属于多分类损失函数,预期输入形状为(批次大小, 类别数)的二维张量。当前模型最后一层fc4输出维度为1,搭配1维的输入样本,最终输出形状为(1,)的1维张量,完全不满足损失函数的输入要求,直接触发维度报错。
其余隐藏逻辑错误
- 损失函数选型不匹配
你当前做的是二分类任务,F.nll_loss需要搭配F.log_softmax使用,且要求模型输出维度等于类别数。如果你要保持单输出的结构,应该选用BCEWithLogitsLoss或者sigmoid+BCELoss的组合,无需使用多分类损失。 - 标签格式不匹配损失要求
F.nll_loss要求标签为形状(批次大小,)的整数类型,你当前的ys是形状(9, 1)的浮点类型,即使维度问题修复也会触发报错。 - 模型输出层激活函数不合理
你在模型最后一层输出用了F.relu,会直接截断所有负数值,会严重影响梯度回传,二分类单输出场景下不需要在此处加relu。
核心修复代码示例
# 建议先修改模型最后一层的激活函数 class Model(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(2, 100) self.fc2 = nn.Linear(100, 200) self.fc3 = nn.Linear(200, 200) self.fc4 = nn.Linear(200, 1) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = F.relu(self.fc3(x)) # 去掉最后的relu,直接输出logits return self.fc4(x) model = Model() Xs = torch.Tensor([[0, 1], [1, 1], [1, 0], [1, 1], [1, 1], [0, 1], [1, 1], [0, 0], [1, 0]]) ys = torch.Tensor([[1], [0], [0], [1], [0], [1], [0], [1], [1]]) # 不需要逐样本遍历的话可以直接批次输入,维度自动匹配 output = model(Xs) loss = F.binary_cross_entropy_with_logits(output, ys) print(loss) # 如果一定要逐样本遍历,给单个样本加批次维度即可 for i, x in enumerate(Xs): # 加维度后形状变为(1, 2) x = x.unsqueeze(0) output = model(x) print(output) label = ys[i].unsqueeze(0) loss = F.binary_cross_entropy_with_logits(output, label)
内容的提问来源于stack exchange,提问作者GeverAL
相关产品推荐
相关产品推荐

