Keras: se esperaba que la activación_3 tuviera forma (Ninguno, 3) pero

Keras: se esperaba que la activación_3 tuviera forma (Ninguno, 3) pero obtuvo una matriz con forma (5708, 1)

Quiero entrenar un perceptrón multicapa simple con Keras. Mi entrada (x_train) es un np.array donde cada punto de datos está representado por un vector de 300 dimensiones. Mi salida debe ser una clase 0,1 o 2. Formas: x_tren: (5708, 300) y_tren: (5708,) forma: (300,)

shape = x_train[0].shape
model = Sequential()
model.add(Dense(32, input_shape=shape))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

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

history = model.fit(x_train, y_train, epochs=5)

Después de llamar a model.fit, aparece este error:

ValueError: Error when checking target: expected activation_3 to have shape (None, 3) but got array with shape (5708, 1)

¿Qué está mal y qué capa es la activación_3?

Mostrar la mejor respuesta

El error ocurre al comparar la salida de su red (forma 5708 x 3) con su y_train proporcionado (forma 5708 x 1)

La salida de su red tiene la forma Tamaño de lote x Núm. clases, es decir, 5708 x 3 (una distribución de probabilidad en las tres clases de salida) y, por lo tanto, las etiquetas de verdad del suelo deben estar codificadas en caliente para poder usar la entropía cruzada categórica

Entonces, para cualquier vector de muestra de entrada de 300 dims, las etiquetas verdaderas deben ser una de [1, 0, 0], [0, 1, 0] o [0, 0, 1]

¡Gracias por tu ayuda! ¡Eso tiene mucho sentido! Ahora funciona.

Convierta su y_train de shape (5708,1) a shape (5708,3)

from keras.utils import np_utils
y_train=np_utils.to_categorical(y_train)

Gracias por el código para transformar mis datos. Ahora funciona.

La forma de y_train tiene que ser (5708,num_classes). Y debes cambiar tu estructura de y_train con keras.utils.to_categorical(labels, num_classes=10)