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
修复方案
你只需要修改以下几处代码即可正常运行:
- 修正数据集类的长度方法:
# 获取长度 def __len__(self): return self.x.shape[0]
- 修正优化器命名,不要重复覆盖:
optimizer_ofit = torch.optim.Adam(model.parameters(), lr=0.01) optimizer_drop = torch.optim.Adam(model_drop.parameters(), lr=0.01)
- 训练循环内修改损失变量名,避免覆盖存储用的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
相关产品推荐
相关产品推荐

