Расширение отличных указателей, предоставленных jakub.
Почти всегда важно перемешать данные поезда и проверки перед их передачей в модель, чтобы оба набора содержали одинаковое распределение изображения.
Предположим, вы разделили данные на два набора и поместили их по следующим путям:
train_dir = '/ data / training'
validation_dir = '/ data / validation'
Первое, что нужно сделать на этом этапе, - разделить каждый пиксель на 255, чтобы они были повторно -масштабируется от 0 до 1. Вдобавок к этому обычно окупается увеличение данных с помощью различных преобразований, например сдвига, поворота, масштабирования, отражения и т. д. c, потому что это в некоторой степени обобщает модель. И то, и другое может быть достигнуто с помощью модуля ImageDataGenerator
следующим образом:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Add our data-augmentation parameters to ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255.,
rotation_range = 40,
width_shift_range = 0.2,
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator( rescale = 1.0/255. )
# Flow training images in batches of 100 using train_datagen generator
train_generator = train_datagen.flow_from_directory(train_dir,
batch_size = 100,
class_mode = 'binary',
target_size = (30, 30))
# Flow validation images in batches of 100 using test_datagen generator
validation_generator = test_datagen.flow_from_directory(validation_dir,
batch_size = 100,
class_mode = 'binary',
target_size = (30, 30))
Теперь, обычно 100% точность обучающих данных означает, что либо функции довольно просты, либо модель переобладает. Может быть полезно создать обратный вызов, чтобы установить порог точности обучения. Проще говоря, обучение остановится, если точность обучения достигнет порогового значения. Мы можем установить его на 99%, как пример.
Все это нормально, но, к сожалению, это не будет смотреть на точность набора проверки. Чтобы исправить это, мы можем ввести регуляризатор, известный как ранняя остановка , который поможет нам остановить обучение, как только точность проверки перестанет улучшаться. Если вы посмотрите на графики, которыми вы поделились, пики точности проверки составляют примерно 25 эпох. После этого вы, скорее всего, просто переборщите. Праймер по керасу раннего отложения доступен здесь . Итак, давайте создадим экземпляры обоих обратных вызовов и будем использовать их на этапе обучения.
# Define a Callback class that stops training once accuracy reaches 98%
class MyCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('acc')>0.99):
print("\nReached 99% accuracy so cancelling training!")
self.model.stop_training = True
training_clbk = MyCallback()
# Define the early stopping Callback
early_stopper_clbk = tf.keras.callbacks.EarlyStopping(
monitor="val_loss",
min_delta=0,
patience=0,
verbose=0,
mode="auto",
baseline=None,
restore_best_weights=False,
)
history = model.fit_generator(
train_generator,
epochs=100,
validation_data=validation_generator,
callbacks = [training_clbk, early_stopper_clbk],
verbose=2)
Это должно решить некоторые из вероятных проблем переобучения, с которыми вы сталкиваетесь. Конечно, выпадение, и регуляризация помогает в большинстве случаев, так что, пожалуйста, поиграйте и с этим.