IndexError: index 9 is out of bounds for axis 1 with size 9

在用karas做分类的时候,本来是10分类任务,数据预处理之后有一类只有一个数据,所以把这类跟相近的合并了,num_classes改成了9,结果出现了错误。

报错

label = np.array(keras.utils.to_categorical(label, num_classes))
File “/root/anaconda3/envs/lvyy/lib/python3.6/site-packages/keras/utils/np_utils.py”, line 29, in to_categorical
categorical[np.arange(n), y] = 1
IndexError: index 9 is out of bounds for axis 1 with size 9

原先

label = [0,1,2,3,4,5,6,7,8,9]
num_classes = 10

合并数据以后

label = [0,1,2,4,5,6,7,8,9]
#第三类合并了
num_classes = 9

出现了上述错误。

原因

查了一下karas的库,num_classes代表的是类别数。但是它默认类别数是从0类到最大类。

举例

eg1:我们初始的label = [0,1,2,3,4,5,6,7,8,9],所以库函数会默认类别数为10类:从0类算起,到最大类9类,一共是10类。这时我们设置num_classes = 10,索引不会出现问题。

eg2:当我们合并第3类时,label = [0,1,2,4,5,6,7,8,9],库函数仍然会默认类别数为10类:从0类算起,到最大类9类,仍然一共是10类。此时设置num_classes = 9,在索引时就会出现超出范围。

eg3:若我们类别从1类开始,既label = [1,2,3,4,5,6,7,8,9],库函数还是会默认为10类,此时若num_classes = 9则会报错。应改为num_classes = 10。

解决办法

了解了报错的原因,解决办法就很好理解了。

方案1

直接将类别号设置为最大类别号+1。

label = [0,1,2,4,5,6,7,8,9]
#第三类合并了
num_classes = 10

方案2

修改后续类别号,使得最大类别号为8。

label = [0,1,2,3,4,5,6,7,8]
#第三类合并了,并修改后续类别号
num_classes = 9

你可能感兴趣的:(菜鸡之路,机器学习,神经网络,python)