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

PyTorch音频分类模型训练报错:Target -1 is out of bounds求助

音频分类器训练错误:Target -1 is out of bounds. 问题排查与解决

问题背景

开发一个音频分类器,输入为128×10377的频谱图矩阵,采用1D卷积层处理,目标是预测50个潜在因子。训练过程中随机出现错误:IndexError: Target -1 is out of bounds.

错误核心原因

  1. 任务类型完全错误:你使用了nn.CrossEntropyLoss(多分类损失函数),但目标是50个连续浮点型潜在因子,这是回归任务而非分类任务。CrossEntropyLoss要求标签是0到num_classes-1的整数类别索引,而你的潜在因子是连续值,强行转换为LongTensor会导致负数被截断为-1,触发越界错误。
  2. 标签处理错误:将浮点型的潜在因子直接转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:15:54