Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am working on training a VGG16-like model in Keras, on a 3 classes subset from Places205, and encountered the following error:

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

I read multiple similar issues but none helped me so far. The error is on the last layer, where I've put 3 because this is the number of classes I'm trying right now.

The code is the following:

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) 
like image 590
Ciprian Andrei Focsaneanu Avatar asked Mar 20 '18 19:03

Ciprian Andrei Focsaneanu


1 Answers

The problem is with your label-data shape. In a multiclass problem you are predicting the probabibility of every possible class, so must provide label data in (N, m) shape, where N is the number of training examples, and m is the number of possible classes (3 in your case).

Keras expects y-data in (N, 3) shape, not (N,) as you've problably provided, that's why it raises an error.

Use e.g. OneHotEncoder to convert your label data to one-hot encoded form.

like image 129
Kamil Kaczmarek Avatar answered Sep 29 '22 22:09

Kamil Kaczmarek