PyTorch训练报错:t()期望张量维度≤2,当前为3D的解决方法
问题排查与修复方案
核心错误:Linear层权重维度不合法
报错RuntimeError: t() expects a tensor with <=2 dimensions, but self is 3D的根源是你手动初始化Linear层权重时,错误地将权重张量转为了3D结构:
nn.Linear(2,3)的权重标准形状应为(3,2)(输出节点数 × 输入节点数)- 你对
k1和k2执行了两次unsqueeze操作,导致张量变成(1,1,6)和(1,1,3),赋值给weight后,权重维度变为3D,触发矩阵转置操作时的维度错误。
修复后的模型权重初始化代码:
class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.d1 = nn.Linear(2,3) self.d2 = nn.Linear(3,1) self.init_weights() def init_weights(self): # 将k1调整为(3,2)的合法形状 k1=torch.tensor([0.1,-0.72,0.94,-0.29,0.12,0.44]).view(3,2) self.d1.weight.data=k1 # 将k2调整为(1,3)的合法形状 k2=torch.tensor([1,-1.16,-0.26]).view(1,3) self.d2.weight.data=k2 def forward(self, x): x = self.d1(x) x = F.tanh(x) x = self.d2(x) out = F.sigmoid(x) return out
其他需修复的问题
1. 损失函数与模型输出不兼容
你使用了CrossEntropyLoss,但模型最后通过sigmoid输出单值,两者不匹配:
CrossEntropyLoss适用于多分类任务,输入需为未激活的logits,输出维度等于类别数(二分类时为2)- 针对你的二分类任务,建议改用
BCEWithLogitsLoss(内置sigmoid计算,无需手动添加),同时调整标签格式:
# 模型forward去掉手动sigmoid def forward(self, x): x = self.d1(x) x = F.tanh(x) return self.d2(x) # 替换损失函数 criterion = nn.BCEWithLogitsLoss() # 训练循环中处理标签:转为float并增加维度匹配输出 labels = labels.float().unsqueeze(1)
2. 重复初始化模型导致优化器失效
代码中先初始化了一次model = MyModel()并绑定了optimizer,之后又重新初始化了一次,导致优化器绑定的是旧模型参数,训练时无法更新新模型。删除第二次初始化代码即可:
# 删除此行:model = MyModel()
3. 日志打印变量未定义
最后打印日志时使用的i未定义,需新增批次计数变量:
for epoch in range(num_epochs): train_running_loss = 0.0 train_acc = 0.0 batch_count = 0 # 新增批次计数器 for inputs, labels in trainloader: # ... 训练逻辑 ... batch_count += 1 # 每批次计数+1 print('Epoch: %d | Loss: %.4f | Train Accuracy: %.2f'%(epoch, train_running_loss / batch_count, train_acc/batch_count))
4. 输入张量类型错误
默认torch.tensor创建的是整数张量,模型需要浮点类型输入,初始化时指定类型:
X=torch.tensor(X1, dtype=torch.float32)
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

