Search code examples
pythontensorflowkerasneural-networkconv-neural-network

logits and labels must have the same first dimension, got logits shape [2048,10] and labels shape [32]


I am trying to use the following code to for a CNN to classify images.

essentially, this code takes in a directory with folders and images, and trains a CNN to classify them.

This is my code:

        self.model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(32, 32, 3)))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.2))
        self.model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.3))
        self.model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((2, 2)))
        self.model.add(Dropout(0.4))
        self.model.add(Flatten())
        self.model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
        self.model.add(BatchNormalization())
        self.model.add(Dropout(0.5))
        self.model.add(Dense(10, activation='softmax'))

    def processModel(self, split, epochs=10):
        datagen = keras.preprocessing.image.ImageDataGenerator(
            rescale=1./255,
            rotation_range=5,
            zoom_range=(0.95, 0.95),
            horizontal_flip=False,
            vertical_flip=False,
            data_format='channels_last',
            validation_split=split,
        )

        train_generator = datagen.flow_from_directory(
            directory=self.path,
            color_mode='rgb',
            class_mode='sparse',
            shuffle=True,
            subset='training',
            seed=7
        )

        test_generator = datagen.flow_from_directory(
            directory=self.path,
            color_mode='rgb',
            class_mode='sparse',
            shuffle=True,
            subset='validation',
            seed=7
        )

        self.model.compile(
            optimizer='adam',
            loss='sparse_categorical_crossentropy',
            metrics=["accuracy"]
        )

        self.model.fit(train_generator, epochs=epochs, verbose=2)
        self.score = self.model.evaluate(test_generator)

I keep getting this error:

logits and labels must have the same first dimension, got logits shape [2048,10] and labels shape [32]

on line:

        self.model.fit(train_generator, epochs=epochs, verbose=2)

does anyone know why this may be happening?


Solution

  • Without knowing your data and data preparation it is hard to reproduce, but I think the problem could be your loss function

    self.model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=["accuracy"]
    )
    

    Try using categorical_crossentropy instead sparse_categorical_crossentropy:

    self.model.compile(
        optimizer='adam',
        loss='categorical_crossentropy',
        metrics=["accuracy"]
    )