I am using Keras to train a CNN for a single label image classification. The model is being trained on synthesized data and applied to real world images. After a significant amount of trial and error I came to the model shown in the code. It gives me the best results for my test data, with an accuracy of about 80 %.
While this is not satisfying I am running out of ideas how to improve the model itself. Since I am new to this kind of machine learning I want to make sure I am not missing the obvious and would be glad if anyone can review my model to tell me, if I am making a rookie mistake somewhere:
model = Sequential([
BatchNormalization(input_shape=input_shape),
Conv2D(8, kernel_size=3, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(16, kernel_size=3, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(32, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(64, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
MaxPooling2D(pool_size = 2),
Conv2D(32, kernel_size=3, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(64, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(64, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
MaxPooling2D(pool_size = 2),
Conv2D(32, kernel_size=3, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(64, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
Conv2D(128, kernel_size=5, padding='same'),
BatchNormalization(),
Activation('relu'),
SpatialDropout2D(0.1),
MaxPooling2D(pool_size = 2),
Flatten(),
Dense(1024),
BatchNormalization(),
Activation('relu'),
Dropout(0.5),
Dense(1024),
BatchNormalization(),
Activation('relu'),
Dropout(0.5),
Dense(num_classes),
BatchNormalization(),
Activation('softmax')
])
model.compile(loss=keras.losses.sparse_categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=[keras.metrics.sparse_categorical_accuracy])