ValueError: ошибка при проверке цели: ожидалось, что плотный_3 будет иметь форму (1,), но получил массив с формой (6,)

Я пытаюсь запустить многоклассовую классификацию, используя следующую модель ИНС:

classifier = Sequential()
classifier.add(Dense(units = 9, kernel_initializer = 'uniform', activation = 'relu', input_dim = 18))
classifier.add(Dense(units = 9, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 9, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 6 ,kernel_initializer = 'uniform', activation = 'softmax'))
classifier.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
classifier.fit(X_train, y_train, batch_size = 10, epochs = 100) 
y_pred = classifier.predict(X_test) 

где формат X_train:

[[31 8 27 ... 2 7 5]
 [31 8 11 ... 1 9 3]
 [6 0 4 ... 1 9 3]
 ...
 [55 55 134 ... 5 5 6]
 [41 9 111 ... 1 3 0]
 [19 9 28 ... 3 0 0]]

а y_train это:

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

Форма X_train - (352, 18), форма y_train - (352, 6), форма X_test - (152, 18).

При запуске выдает следующую ошибку:

Traceback (most recent call last):
  File "H:\p36564\Project ZS\tst1.py", line 110, in <module>
    classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)
  File "H:\p36564\lib\site-packages\keras\engine\training.py", line 950, in fit 
    batch_size=batch_size)
  File "H:\p36564\lib\site-packages\keras\engine\training.py", line 787, in _standardize_user_data
    exception_prefix='target')
  File "H:\p36564\lib\site-packages\keras\engine\training_utils.py", line 137, in standardize_input_data
    str(data_shape))
ValueError: Error when checking target: expected dense_3 to have shape (1,) but got array with shape (6,)

В чем могут быть возможные причины этой ошибки? Любая помощь будет оценена.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С y_train в той форме, в которой вы его предоставляете, используйте categorical_crossentropy в качестве функции потерь вместо sparse_categorical_crossentropy. Ваш y_train кодируется быстро, а не редко. В вашем случае разреженной кодировкой будет массив, который выглядит следующим образом:

[3, 4, 4, ..., 5, 5, 5]

Чтобы попробовать это на себе, конвертируйте y_train в разреженную кодировку следующим образом:

y_train_ = np.argmax(y_train, axis=1)

Это будет работать с sparse_categorical_crossentropy как функция потерь (без изменения архитектуры модели!)

Другие вопросы по теме