В чем проблема с моим последним плотным слоем кераса?

Я работаю над небольшой NN в keras для проблемы классификации нескольких классов. У меня 9 разных ярлыков и у меня тоже 9 характеристик.

Мои формы поезда/теста следующие:

Sets shape:
x_train shape: (7079, 9)
y_train shape: (7079,)
x_test shape: (7079, 9)
y_test shape: (7079,)

Но когда я пытаюсь сделать их категоричными:

y_train = tf.keras.utils.to_categorical(y_train, num_classes=9)
y_test = tf.keras.utils.to_categorical(y_test, num_classes=9)

Я получаю следующую ошибку:

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

Вот дополнительная информация о y_train

print(np.unique(y_train)) # [1. 2. 3. 4. 5. 6. 7. 8. 9.]
print(len(np.unique(y_train))) # 9

Кто-нибудь знает, в чем проблема?


person Liz    schedule 04.04.2021    source источник


Ответы (1)


Форма y_train - 1D. Вы должны сделать его горячим закодированным. Что-то типа

y_train = tf.keras.utils.to_categorical(y_train , num_classes=9)

То же самое касается и y_test.

Обновлять

Согласно документу,

tf.keras.utils.to_categorical(y, num_classes=None, dtype="float32")

Здесь y: вектор класса, который нужно преобразовать в матрицу (целые числа от 0 до num_classes). Как и в вашем случае, y_train это что-то вроде [1,2,..]. Вам нужно сделать следующее:

y_train = tf.keras.utils.to_categorical(y_train - 1, num_classes=9)

Вот пример для справки. Если мы сделаем

class_vector = np.array([1, 1, 2, 3, 5, 1, 4, 2])
print(class_vector)

output_matrix = tf.keras.utils.to_categorical(class_vector, 
                                      num_classes = 5, dtype ="float32")
print(output_matrix)
[1 1 2 3 5 1 4 2]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-15-69c8be7a0f1a> in <module>()
      6 print(class_vector)
      7 
----> 8 output_matrix = tf.keras.utils.to_categorical(class_vector, num_classes = 5, dtype ="float32")
      9 print(output_matrix)

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/utils/np_utils.py in to_categorical(y, num_classes, dtype)
     76   n = y.shape[0]
     77   categorical = np.zeros((n, num_classes), dtype=dtype)
---> 78   categorical[np.arange(n), y] = 1
     79   output_shape = input_shape + (num_classes,)
     80   categorical = np.reshape(categorical, output_shape)

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

Чтобы решить эту проблему, мы конвертируем данные в формат с отсчетом от нуля.

output_matrix = tf.keras.utils.to_categorical(class_vector - 1, 
                                     num_classes = 5, dtype ="float32")
print(output_matrix)

[[1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0.]]
person M.Innat    schedule 04.04.2021
comment
дайте мне знать, если это работает для вас или нет. Хотя должно. - person M.Innat; 04.04.2021
comment
Теперь он снова жалуется: IndexError: индекс 9 выходит за пределы оси 1 с размером 9 - person Liz; 04.04.2021
comment
Не могли бы вы добавить информацию о ваших x_train и y_trian? - person M.Innat; 04.04.2021
comment
TRAIN - Dataset No. of Rows: 7079 TRAIN - Dataset No. of Columns: 10 TEST - Dataset No. of Rows: 7079 TEST - Dataset No. of Columns: 10 Из этих 10 столбцов самый первый — это цель, а остальные — функции. Форма x_train: (7079, 9) Форма y_train: (7079,) ‹class 'numpy.ndarray'› - person Liz; 04.04.2021
comment
Не могли бы вы проверить этот ответ и убедиться, что это не происходит с вашим случаем. stackoverflow.com/a/41666051/9215780 - person M.Innat; 04.04.2021
comment
Не совсем... Я только что сделал print(np.unique(y_train)), и он вернул [1. 2. 3. 4. 5. 6. 7. 8. 9.] и print(len(np.unique(y_train))) и вернул 9. - person Liz; 04.04.2021
comment
Хорошо, пожалуйста, обновите свой вопрос с помощью последней трассировки. Было бы намного яснее. - person M.Innat; 04.04.2021
comment
Должно быть num_classes=9 , а не 10. - person M.Innat; 04.04.2021
comment
Только что обновил. 9 все еще выдает ту же ошибку. - person Liz; 04.04.2021
comment
Можешь попробовать это ..to_categorical(y_train - 1, num_classes=9) - person M.Innat; 04.04.2021
comment
Это сработало! Спасибо большое! - person Liz; 04.04.2021