ValueError: формы (1, 2) и (1, 4) несовместимы - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь решить простую задачу многоклассовой классификации. Но почему-то я получаю эту ошибку. Программа работает, когда я использую один слой с двумя нейронами, но результаты не очень хорошие, но это не имеет смысла, потому что это проблема мультикласса, поэтому выходной слой должен иметь 4 нейрона на выходе. После этого это не работает. Я думаю, что есть очень глупая ошибка, которую я делаю здесь. Ниже мой код.

import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
from tensorflow.keras.optimizers import Adam

# Generate dummy data
import numpy as np
x_train = np.array([[1, 1],
                   [1, 2],
                   [2, 2],
                   [-1,0],
                   [-1,-2],
                   [2, 1],
                   [-1,-2],
                   [-1,-2]])
print(x_train.shape)
y_train = np.array([[0,0],
                    [0,0],
                    [0,1],
                    [0,1],
                    [1,0],
                    [1,0],
                    [1,1],
                    [1,1]])

# from keras.utils.np_utils import to_categorical
# y_train = to_categorical(y_train)
print(y_train.shape)

model = Sequential()
model.add(Dense(8, activation='relu', input_dim=2))
# model.add(Dropout(0.5))
# model.add(Dense(4, activation='relu'))
model.add(Dense(4, activation='softmax'))
# model.add(Dropout(0.5))
adm = Adam(lr=0.001)
# sgd = SGD(lr=0.001)
model.compile(loss='categorical_crossentropy',
              optimizer=adm,
              metrics=['accuracy'])

model.fit(x_train, y_train,  epochs=20,  batch_size=1)
score = model.evaluate(x_train, y_train, batch_size=1)

Ошибка:

ValueError: Shapes (1, 2) and (1, 4) are incompatible

1 Ответ

0 голосов
/ 04 апреля 2020

Я решил эту ошибку. Причиной были мои ярлыки, т. Е. Y_train не подходящей формы, что вызвало проблему. Здесь количество классов равно 4, и мои тренировочные данные помечены в этом формате [0,0,1,1,2,2,3,3]. В моем изложении проблемы выше то, как я представлял свои ярлыки в категориальном формате, было совершенно неверным. Поэтому для правильного кодирования данных я использовал ** keras.utils.to_categorical (y) **, чтобы преобразовать мои метки в одноразовое кодирование, которое сработало и решило ошибку формы.

y_train = keras.utils.to_categorical(y) 

После этого форма становится:

(8, 4)

Поэтому, когда возникает проблема с несколькими классами, форма меток при кодировании ее в тип горячего кодирования должна быть

(size_of_data, num_classes).

Теперь я узнал, как правильно кодировать данные при работе с многоклассовой проблемой и, если возникает такая ошибка, где искать решение проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...