Я пытаюсь создать нейронную сеть, используя Python с Keras, с целью определения дверей и окон на фотографиях и видео.Вот моя архитектура:
img_width = 32
img_height = 32
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(img_width, img_height, 3)))
model.add(BatchNormalization())
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
Я использую оптимизатор Адама с параметрами по умолчанию и категориальной функцией потери кроссентропии.У меня есть 3 класса входных данных, 685 изображений каждый, и я использую ImageDataGenerator на них.Я также умножил значения steps_per_epoch
и validation_steps
на fit_generator
, чтобы компенсировать небольшие наборы данных.Размер партии равен 32.
train_data_generator = ImageDataGenerator(
rescale=1. / 255,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.2)
train_generator = train_data_generator.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
subset='training')
validation_generator = train_data_generator.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
subset='validation')
early_stopping = EarlyStopping(monitor='val_loss',
min_delta=1e-3,
patience=10,
verbose=1,
mode='auto',
restore_best_weights=True)
history = model.fit_generator(
train_generator,
steps_per_epoch=8*nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=8*nb_validation_samples // batch_size,
callbacks=[tensor_board, model_checkpoint, early_stopping])
Теперь моя проблема в том, что моя точность проверки обычно застревает на ~ 70%, в то время как потери проверки начинают быстро расти.В то же время потери при тренировках приближаются к 0, а точность тренировок почти достигает 100%.До сих пор я пытался противостоять этому:
- изменяя размер пакета на другие степени 2;
- изменяя скорость обучения Адама;
- пробуя другой оптимизатор;
- с использованием
ReduceLROnPlateau
или LearningRateScheduler
; - , меняющим значение параметра Dropout на любое значение в диапазоне 0,2-0,95;
- с использованием Dropouts вместо BatchNormalization;
- изменение размера изображений.
И, конечно, различные их комбинации.Я также изменил весь набор данных (до того, как он стал непоследовательным, изображения внутри классов сильно различались, и классы имели разные размеры).Казалось, ничего не работает.Есть идеи, что я могу делать не так?