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?
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"]
)