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

PyTorch报IndexError: too many indices for tensor of dimension 0如何解决

报错原因
  • 核心问题是变量名重复覆盖:你在训练代码前半段定义了字典类型的loss用来存储多组损失数据,但是进入训练循环后,你用loss = criterion(yhat, data_set.y)把原来的字典变量直接覆盖成了PyTorch的0维损失标量。后续你尝试用字典键loss["training_data_no_dropout"]访问标量张量,就触发了维度不足的索引错误。
    除此之外你的代码还有几处隐含错误,也会导致后续运行报错:
  • 数据集类Data的__len__方法返回了不存在的属性self.len,会触发属性不存在错误
  • 优化器定义重复赋值:两次优化器都赋值给了变量optimizer,导致无dropout模型的优化器被dropout模型的优化器覆盖
  • 拼写错误:存储损失时loss_drop.item漏了括号,应该是loss_drop.item();验证损失存储的方法名appent拼写错误,应该是append
修复方案

你只需要修改以下几处代码即可正常运行:

  1. 修正数据集类的长度方法:
# 获取长度
def __len__(self):
    return self.x.shape[0]
  1. 修正优化器命名,不要重复覆盖:
optimizer_ofit = torch.optim.Adam(model.parameters(), lr=0.01)
optimizer_drop = torch.optim.Adam(model_drop.parameters(), lr=0.01)
  1. 训练循环内修改损失变量名,避免覆盖存储用的loss字典,同时修正拼写错误:
# ------------------------- 训练过程
for epoch in range(500):
    # 全量样本训练
    yhat = model(data_set.x)
    yhat_drop = model_drop(data_set.x)
    # 损失变量改名,不和存储字典重名
    train_loss = criterion(yhat, data_set.y)
    train_loss_drop = criterion(yhat_drop, data_set.y)
    
    # 存储两个模型的训练集和验证集损失
    loss["training_data_no_dropout"].append(train_loss.item())
    loss["validation_data_no_dropout"].append(criterion(model(validation_set.x), validation_set.y).item())
    # 补全item的括号
    loss["training_data_dropout"].append(train_loss_drop.item())
    model_drop.eval()
    # 修正append拼写错误
    loss["validation_data_dropout"].append(criterion(model_drop(validation_set.x), validation_set.y).item())
    model_drop.train()
    
    optimizer_ofit.zero_grad()
    optimizer_drop.zero_grad()
    train_loss.backward()
    train_loss_drop.backward()
    optimizer_ofit.step()
    optimizer_drop.step()

内容的提问来源于stack exchange,提问作者z.ghane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:02