编写class balancing loss代码触发IndexError数组索引错误如何解决
错误原因
- 报错的核心是NumPy数组的维度和索引方式不匹配:你当前使用的
mdlParams['labels_array']是一维数组,仅支持单维度的索引(比如仅传行索引的写法arr[ind]),但你代码里使用了[行索引, 列索引]的二维数组索引语法,比如[mdlParams['trainInd'],:]、[indices_ham,:8],系统识别到你给1维数组传了2个维度的索引,就会抛出该错误。 - 常见触发场景:你的标签数组存储的是单标签分类的原始标签值,没有做one-hot编码,所以结构是
(样本数,)的一维结构,而非你预期的(样本数, 类别数)的二维结构。
简单复现示例:
arr = np.array([0,1,0,1])(一维,shape为(4,)),执行arr[[0,2], :]就会抛出完全相同的错误。
修复方案
首先先加一行调试代码确认标签数组的实际结构:
print(mdlParams['labels_array'].shape)
再根据你的实际需求选择对应修复方式:
方案1:标签确实为一维单标签结构,调整索引写法
不需要加第二个维度的索引,直接取对应样本的标签统计频率计算权重即可,示例如下:
# 原错误写法:class_weights = 1.0/np.mean(mdlParams['labels_array'][mdlParams['trainInd'],:],axis=0) # 修改后 train_labels = mdlParams['labels_array'][mdlParams['trainInd']] # 统计每个类别的样本数,计算类平衡权重 class_counts = np.bincount(train_labels.astype(int)) class_weights = 1.0 / class_counts
对应你报错的那行代码修改如下:
# 原错误写法:class_weights_ = 1.0/np.mean(mdlParams['labels_array'][indices_ham,:8],axis=0) # 修改后,minlength=8保证统计结果至少包含8个类别的计数 train_labels_ham = mdlParams['labels_array'][indices_ham] class_counts_ham = np.bincount(train_labels_ham.astype(int), minlength=8) class_weights_ = 1.0 / class_counts_ham
方案2:标签应为二维多标签/one-hot结构,先转换标签维度
如果确认你的标签应该是(样本数, 类别数)的二维结构,说明你之前生成labels_array时没有做one-hot编码,补充转换逻辑即可:
from tensorflow.keras.utils import to_categorical # num_classes替换为你的实际类别总数 mdlParams['labels_array'] = to_categorical(mdlParams['labels_array'], num_classes=num_classes)
转换完成后你原来的二维索引写法就可以正常运行。
内容的提问来源于stack exchange,提问作者saba
相关产品推荐
相关产品推荐

