У меня есть около 14 000 изображений для задачи двоичной классификации по распознаванию лиц. Около 12 000 изображений используются для обучения и 2200 для проверки. Моя архитектура CNN выглядит следующим образом -
regularizer = tf.keras.regularizers.l2(l=0.001)
init = tf.initializers.he_uniform()
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3, 3), strides = (1, 1), padding='same', activation='relu', kernel_initializer=init, kernel_regularizer=regularizer, input_shape=(ht, wd, 3)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
tf.keras.layers.Conv2D(64, (5, 5), (1, 1), padding='same', activation='relu', kernel_initializer=init, kernel_regularizer=regularizer),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D((2, 2), (2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), (1, 1), padding='same', activation='relu', kernel_initializer=init, kernel_regularizer=regularizer),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D((2, 2), (2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), (1, 1), padding='same', activation='relu', kernel_initializer=init, kernel_regularizer=regularizer),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D((2, 2), (2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), (1, 1), padding='same', activation='relu', kernel_initializer=init, kernel_regularizer=regularizer),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.MaxPooling2D((2, 2), (2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation = 'relu', kernel_regularizer= regularizer),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Dense(1, activation = 'sigmoid')
])
Размеры моего входного изображения составляют 150 * 180 * 3. CNN имеет около 900k - 1M параметров. Я использую партию размером 16/32. Кроме того, мой планировщик скорости обучения (начальный lr = 0,001) оптимизатора Adam выглядит следующим образом:
reduce_lr_2 = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss',
factor=0.2,
patience=2,
verbose=0,
mode='auto',
min_delta=0.0001,
cooldown=1,
min_lr=0)
Я применил увеличение данных многих типов. Точность обучения, которую я достигаю, составляет около 95-96%, а точность проверки - около 90%. Я пытался изменить многие гиперпараметры, но точность проверки остается на уровне около 90%. Есть ли способ улучшить точность проверки?