Это нормально, когда мой проигрыш в тесте достигает миллионов? - PullRequest
0 голосов
/ 12 июля 2020

Я обучаю модель на нескольких итерациях (обучение, сохранение и снова обучение) на второй итерации, мой val_loss по какой-то причине достиг миллионов. Что-то не так с тем, как я импортирую модель?

Вот как я сохранил свою исходную модель после первого запуска

model.save('/content/drive/My Drive/Colab Notebooks/path/to/save/locaiton',save_format='tf')

, и вот как я импортирую и перезаписываю ее

def retrainmodel(model_path,tr_path,v_path):
  image_size = 224
  BATCH_SIZE_TRAINING = 10
  BATCH_SIZE_VALIDATION = 10
  BATCH_SIZE_TESTING = 1
  EARLY_STOP_PATIENCE = 6
  STEPS_PER_EPOCH_TRAINING = 10
  STEPS_PER_EPOCH_VALIDATION = 10
  NUM_EPOCHS = 20 

  model = tf.keras.models.load_model(model_path)

  data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)


  train_generator = data_generator.flow_from_directory(tr_path,
        target_size=(image_size, image_size),
        batch_size=BATCH_SIZE_TRAINING,
        class_mode='categorical')
  
  validation_generator = data_generator.flow_from_directory(v_path,
        target_size=(image_size, image_size),
        batch_size=BATCH_SIZE_VALIDATION,
        class_mode='categorical') 
  
  cb_early_stopper = EarlyStopping(monitor = 'val_loss', patience = EARLY_STOP_PATIENCE)
  cb_checkpointer = ModelCheckpoint(filepath = 'path/to/checkpoint/folder', monitor = 'val_loss', save_best_only = True, mode = 'auto')

  fit_history = model.fit(
        train_generator,
        steps_per_epoch=STEPS_PER_EPOCH_TRAINING,
        epochs = NUM_EPOCHS,
        validation_data=validation_generator,
        validation_steps=STEPS_PER_EPOCH_VALIDATION,
        callbacks=[cb_checkpointer, cb_early_stopper]
  )

  model.save('/content/drive/My Drive/Colab Notebooks/path/to/save/locaiton',save_format='tf')
this is my output after passing my directories onto this function

Found 1421 images belonging to 5 classes.
Found 305 images belonging to 5 classes.
Epoch 1/20
10/10 [==============================] - 233s 23s/step - loss: 2.3330 - acc: 0.7200 - val_loss: 4.6237 - val_acc: 0.4400
Epoch 2/20
10/10 [==============================] - 171s 17s/step - loss: 2.7988 - acc: 0.5900 - val_loss: 56996.6289 - val_acc: 0.6800
Epoch 3/20
10/10 [==============================] - 159s 16s/step - loss: 1.2776 - acc: 0.6800 - val_loss: 8396707.0000 - val_acc: 0.6500
Epoch 4/20
10/10 [==============================] - 144s 14s/step - loss: 1.4562 - acc: 0.6600 - val_loss: 2099639.7500 - val_acc: 0.7200
Epoch 5/20
10/10 [==============================] - 126s 13s/step - loss: 1.0970 - acc: 0.7033 - val_loss: 50811.5781 - val_acc: 0.7300
Epoch 6/20
10/10 [==============================] - 127s 13s/step - loss: 0.7326 - acc: 0.8000 - val_loss: 84781.5703 - val_acc: 0.7000
Epoch 7/20
10/10 [==============================] - 110s 11s/step - loss: 1.2356 - acc: 0.7100 - val_loss: 1000.2982 - val_acc: 0.7300

вот мой оптимизатор:

sgd = optimizers.SGD(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = True)
model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = 'acc') 

где, по-вашему, я ошибаюсь?

Я обучаю свою модель партиями, потому что я работаю в google colab всего с 22К изображениями, поэтому эти результаты получены после загрузки в сеть 2800 обучающих изображений. Как вы думаете, он справится сам, если я скармливаю ему больше изображений, или что-то серьезно не так?

1 Ответ

0 голосов
/ 19 июля 2020

Я думаю, что это потеря - нехорошо. Логично иметь более высокие потери в первые несколько эпох, когда мы загружаем модель и переобучаем ее. Однако эта величина потерь не должна взлетать до звезд, как в вашем случае. Если во время сохранения значение потерь было примерно 0,5, то при загрузке той же модели для переобучения оно не должно превышать 10-кратное предыдущее значение, поэтому ожидается значение 5 + - 1. [ПРИМЕЧАНИЕ: это чисто на основе опыта. Не существует общего метода, чтобы узнать убыток заранее.]

Если ваш убыток слишком велик, было бы разумно следующее:

  1. Различные наборы данных - изменение динамики обучающий набор данных может вызвать такое поведение модели.

  2. Сохранение модели могло изменить веса

Предлагаемые решения:

  1. Попробуйте использовать save_weights вместо метода save в модели

     model.save_weights('path/to/filename.h5')
    

    также используйте load_weights вместо load_model

     model = call_cnn_function_to_build_model()
     model.compile(... your args ...)
     model = model.load_weights('path/to/filename.h5')
    
  2. Поскольку у вас есть контрольные точки , попробуйте использовать сохраненные модели контрольных точек. Поэтому вместо окончательной модели попробуйте загрузить модель с контрольной точки, которая находится рядом с вашими последними эпохами.

PS: С благодарностью приняты исправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...