PyTorch音频分类模型训练报错:Target -1 is out of bounds求助
音频分类器训练错误:Target -1 is out of bounds. 问题排查与解决
问题背景
开发一个音频分类器,输入为128×10377的频谱图矩阵,采用1D卷积层处理,目标是预测50个潜在因子。训练过程中随机出现错误:IndexError: Target -1 is out of bounds.
错误核心原因
- 任务类型完全错误:你使用了
nn.CrossEntropyLoss(多分类损失函数),但目标是50个连续浮点型潜在因子,这是回归任务而非分类任务。CrossEntropyLoss要求标签是0到num_classes-1的整数类别索引,而你的潜在因子是连续值,强行转换为LongTensor会导致负数被截断为-1,触发越界错误。 - 标签处理错误:将浮点型的潜在因子直接转换为
torch.LongTensor,会把小于-0.5的浮点值截断为-1,产生非法标签值,导致CrossEntropyLoss报错。
解决方案
1. 修正任务类型与损失函数
将分类任务改为回归任务,替换损失函数:
# 替换原来的CrossEntropyLoss,改用回归损失 criterion = nn.MSELoss() # 均方误差损失,适用于连续值回归 # 或根据需求选择L1Loss(平均绝对误差) # criterion = nn.L1Loss()
2. 修正Dataset中的标签处理
不需要将潜在因子转换为LongTensor,保持浮点型的FloatTensor即可:
# 修改SoundDS类中的标签处理部分 latent_factors = np.array(self.df.iloc[idx, 2:52], dtype=np.float64) latent_factors = torch.from_numpy(latent_factors).type(torch.FloatTensor) # 改为FloatTensor
3. 修正训练代码中的指标计算
原来的准确率统计是分类任务逻辑,回归任务需替换为回归指标(如MSE):
# 替换训练函数中的准确率统计逻辑 running_mse = 0.0 # 改为统计MSE损失 # 循环内: loss = criterion(outputs, labels) running_mse += loss.item() # epoch结束时: avg_mse = running_mse / num_batches print(f'Epoch: {epoch}, MSE Loss: {avg_mse:.6f}')
4. 修复模型维度不匹配问题(隐藏坑)
卷积输出直接传入线性层会导致维度不匹配,需先合并通道与长度维度:
def forward(self, x): # 卷积与池化操作 x = self.conv1(x) x = self.pool1(x) x = self.conv2(x) x = self.pool2(x) # 新增:合并通道与长度维度 x = x.flatten(start_dim=1) # 形状变为(batch_size, 128*517) # 同步修改__init__中的fc1输入维度 # self.fc1 = nn.Linear(66176, 400) x = self.fc1(x) x = self.fc2(x) return x
总结
核心问题是混淆了分类与回归任务,错误使用分类损失函数处理连续值标签,同时标签类型转换产生非法值。按上述步骤修改后,即可解决Target -1 is out of bounds.错误,同时修复模型维度问题。
内容的提问来源于stack exchange,提问作者Rocket
相关产品推荐
相关产品推荐

