53 votes

Erreur lors de la vérification de la cible: le dense_3 devrait avoir la forme (3,) mais le tableau a la forme (1,)

Je travaille sur la formation d'un modèle de type VGG16 à Keras, sur un sous-ensemble de 3 classes de Places205, et j'ai rencontré l'erreur suivante:

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

J'ai lu plusieurs numéros similaires mais aucun ne m'a aidé jusqu'à présent. L'erreur est sur la dernière couche, où j'ai mis 3 parce que c'est le nombre de classes que j'essaie en ce moment.

Le code est le suivant:

 import keras from keras.datasets
import cifar10 from keras.preprocessing.image 
import ImageDataGenerator from keras.models 
import Sequential 
from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D 
from keras import backend as K import os


# Constants used  
img_width, img_height = 224, 224  
train_data_dir='places\\train'  
validation_data_dir='places\\validation'  
save_filename = 'vgg_trained_model.h5'  
training_samples = 15  
validation_samples = 5  
batch_size = 5  
epochs = 5


if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height) else:
    input_shape = (img_width, img_height, 3)

model = Sequential([
    # Block 1
    Conv2D(64, (3, 3), activation='relu', input_shape=input_shape, padding='same'),
    Conv2D(64, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    # Block 2
    Conv2D(128, (3, 3), activation='relu', padding='same'),
    Conv2D(128, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    # Block 3
    Conv2D(256, (3, 3), activation='relu', padding='same'),
    Conv2D(256, (3, 3), activation='relu', padding='same'),
    Conv2D(256, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    # Block 4
    Conv2D(512, (3, 3), activation='relu', padding='same'),
    Conv2D(512, (3, 3), activation='relu', padding='same'),
    Conv2D(512, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    # Block 5
    Conv2D(512, (3, 3), activation='relu', padding='same',),
    Conv2D(512, (3, 3), activation='relu', padding='same',),
    Conv2D(512, (3, 3), activation='relu', padding='same',),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    # Top
    Flatten(),
    Dense(4096, activation='relu'),
    Dense(4096, activation='relu'),
    Dense(3, activation='softmax') ])

model.summary()

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# no augmentation config train_datagen = ImageDataGenerator() validation_datagen = ImageDataGenerator()
     train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

model.fit_generator(
    train_generator,
    steps_per_epoch=training_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=validation_samples // batch_size)

model.save_weights(save_filename)
 

31voto

Kamil Kaczmarek Points 184

Le problème est avec votre étiquette-forme des données. Dans un multiclass problème vous êtes à la prédiction de la probabibility de chaque classe, il doit fournir les données de l'étiquette dans (N, m) de la forme, où N est le nombre d'exemples de formation, et m est le nombre de classes possibles (3 dans votre cas).

Keras s'attend à y-données dans (N, 3) forme, pas de (N,) comme vous l'avez probablement fourni, c'est pourquoi il génère une erreur.

Utiliser, par exemple, OneHotEncoder pour convertir votre étiquette de données à chaud sous forme codée.

29voto

Peter Points 234

Comme mentionné par d'autres, Keras s'attend à "chaude" de l'encodage en multiclass problèmes.

Keras est livré avec une fonction très pratique pour recoder les étiquettes:

print(train_labels)
[1. 2. 2. ... 1. 0. 2.]

print(train_labels.shape)
(2000,)

Recode étiquettes à l'aide d' to_categorical pour obtenir la bonne forme des entrées:

from keras.utils import to_categorical
train_labels = to_categorical(train_labels)

print(train_labels)
[[0. 1. 0.]
 [0. 0. 1.]
 [0. 0. 1.]
 ...
 [0. 1. 0.]
 [1. 0. 0.]
 [0. 0. 1.]]

print(train_labels.shape)
(2000, 3)  # viz. 2000 observations, 3 labels as 'one hot'

D'autres importent des choses à modifier/vérifier dans multiclasse (par rapport à la classification binaire):

Ensemble class_mode='categorical' dans la generator() fonction(s).

N'oubliez pas que la dernière couche dense doit spécifier le nombre d'étiquettes (ou classes):

model.add(layers.Dense(3, activation='softmax'))

Assurez-vous que activation= et loss= est choisi de manière à convenir à la multiclasse problèmes, habituellement, cela signifie qu' activation='softmax' et loss='categorical_crossentropy'.

12voto

Doctor Strange Points 101

Eu le même problème. Pour résoudre le problème, vous pouvez simplement changer dans validation_generator et train_generator le mode de classe de «binaire» à «catégorique» - c'est parce que vous avez 3 classes - ce qui n'est pas binaire.

6voto

Vinay Verma Points 109

Problème: dense_3 devrait avoir la forme (3,) mais a obtenu le tableau avec la forme (1,)

Si vous l'utilisez pour la classification, le nombre de variables doit être correct dans le paramètre d'ajout d'une couche dense.

 variables_for_classification=5 #change it as per your number of categories
model.add(Dense(variables_for_classification, activation='softmax'))

model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size,validation_split=0.1,callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])
 

Pour être plus clair. Comme j'utilisais le LSTM pour prédire la catégorie des nouvelles et les catégories étaient 5 - affaires, technologie, politique, sports, divertissement

Dans cette fonction dense quand j'ai mis 5, cela a fonctionné correctement.

2voto

Tinashe Tivatyi Points 21

La raison en est que vous auriez utilisé le mode_classe 'binaire' dans la méthode fit_generator () pour un problème multi-classe. Changez cela en «catégorique» et l'erreur disparaît.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X