【问题记录1: “IndexError: index 13 is out of bounds for axis 1 with size 13“】

问题记录1: “IndexError: index 13 is out of bounds for axis 1 with size 13“

问题排查过程

  1. 首先检查类别数目的设置,类别数目为14,类别数目设置为14,因此index应该可以达到13,排除此问题。

  2. 通过打印出具体类别的标签发现,一个batch的样本缺少9这个标签,所以总共类别数只有13个,所以无法索引到13。
    【问题记录1: “IndexError: index 13 is out of bounds for axis 1 with size 13“】_第1张图片

原因:数据集类别不平衡,类别9的样本数比较少,一个batch中没有随机采样到类别9。

解决方法:增加batch size为256(原来为128)。

效果:问题解决。附带效果,训练的准确度竟然也有所上升(97提升到98)。开心:)

————————————————————————————————————————
后来发现,增加batch的情况并不能从根本上解决类别缺少的问题。

进一步解决:将类别标签后面增加与类别数目相同的一系列数,比如这里是14类,就加上[0,1,2,…,13],在后面的one-hot表示后,再去除后面14个数。

    label = np.array(label)
    # 加上14个数(以防有的类别在batch中没出现对后面预测产生影响)
    for i in range(NB_CLASSES):
        label = np.append(label, i)one_hot_encoder = OneHotEncoder(sparse=False, handle_unknown='ignore')
    one_hot_encoder.fit(label.reshape(-1, 1))
    true_scores = one_hot_encoder.transform(label.reshape(-1, 1))
   
    #将之前加上的14个值都去掉
    true_scores = true_scores[:-14]`

新问题出现:ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.

新问题原因:预测的过程,模型将样本全部预测为同一类标签(但之后会逐渐预测对)。

新问题解决:使用try-except来捕捉出现的ValueError错误,pass之后使其正常运行。

(参考链接:https://blog.csdn.net/m0_37634290/article/details/108822914 )

————————————————————————————————————————
最终发现,其实可以不需要每个epoch都计算准确度、roc什么的,直接最终计算就可以。这样一来上面的问题就不存在了:(

你可能感兴趣的:(pytorch)