【问题标题】:CNN - index 6 is out of bounds for axis 1 with size 6CNN - 索引 6 超出轴 1 的范围,大小为 6
【发布时间】:2021-11-24 19:00:34
【问题描述】:

我总共有六节课。标签 1-6。 我不确定为什么会收到以下错误消息: “索引 6 超出轴 1 的范围,大小为 6”

X_train, X_test, y_train, y_test = train_test_split(final, y, test_size=0.25, random_state=42)

print("X:", final.shape)
print("y:", y.shape)

print("Xtrain:", X_train.shape)
print("y_train:", y_train.shape)
print("X_test:", X_test.shape)
print("y_test:", y_test.shape)

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

y_train = keras.utils.np_utils.to_categorical(y_train, num_classes)
y_test = keras.utils.np_utils.to_categorical(y_test, num_classes)

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(30, 1200, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(num_classes))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=1, validation_data=(X_test, y_test))

----> y_train = keras.utils.np_utils.to_categorical(y_train, num_classes) IndexError:索引 6 超出轴 1 的范围,大小为 6

如果有帮助,上述形状的打印会提供以下输出:

X: (1134, 100, 1200)
y: (1134,)
Xtrain: (850, 100, 1200)
y_train: (850,)
X_test: (284, 100, 1200)
y_test: (284,)

网络的其余部分是否正确定义?

【问题讨论】:

  • 试试这个to_categorical(y_train - 1, num_classes)
  • 似乎工作正常。但是,我在最后一个单元格中也出现错误:“history = model.fit..” ValueError:层序贯_14 的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:(无、100、1200)。不知道为什么。
  • 六个类不应该对应标签0-5吗?
  • 好提示。我要将标签更改为 0-5(从 1-6)

标签: python tensorflow machine-learning keras


【解决方案1】:

您需要检查 y 中的值。这些值都应该在从 0 到类数-1 的范围内。例如确定 y 使用的类数 np.独特的

y=[0,1,2,3,4,5,4,3,2,1,0,]
unique=np.unique(y)
num_classes=len(unique)
print (unique, 'num_classes= ', num_classes)

结果是

[0 1 2 3 4 5] num_classes=  6

如果你跑了

y_cat=keras.utils.to_categorical(y, num_classes)
print (y_cat)

结果是

[[1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0.]]

注意使用 keras.utils.to_categorical(y, num_classes) 每个 y 值必须是 小于 num_classes 否则会抛出错误。例如更改 Y 以包含值 50

y=[0,1,2,3,4,50,4,3,2,1,0,]
unique=np.unique(y)
num_classes=len(unique)
print (unique, 'num_classes= ', num_classes)

如果你运行它,结果是

[ 0  1  2  3  4 50] num_classes=  6

但是如果你随后运行

y_cat=keras.utils.to_categorical(y, num_classes)
print (y_cat)

你得到错误

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 2015-08-06
  • 2015-10-13
  • 2021-05-16
  • 2019-01-21
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多