Значение потери тренировки увеличивается после некоторого времени обучения, но модель обнаруживает объекты довольно хорошо - PullRequest
1 голос
/ 05 мая 2019

Я сталкиваюсь со странной проблемой при обучении CNN обнаружению объектов из моего собственного набора данных. Я использую трансферное обучение, и в начале обучения величина потерь уменьшается (как и ожидалось). Но через некоторое время оно становится все выше и выше, и я понятия не имею, почему это происходит.

В то же время, когда я смотрю на вкладку Изображения на Tensorboard, чтобы проверить, насколько хорошо CNN предсказывает объекты, я вижу, что он делает это очень хорошо, он не выглядит так, как получает хуже со временем. Кроме того, графики Precision и Recall выглядят хорошо, только графики Loss (особенноification_loss) показывают тенденцию к увеличению во времени.

Вот некоторые конкретные детали:

  • У меня есть 10 различных классов логотипов (например, DHL, BMW, FedEx и т. Д.)
  • Около 600 изображений в классе
  • Я использую tenorflow-gpu в Ubuntu 18.04
  • Я попробовал несколько предварительно обученных моделей, последняя из которых fast_rcnn_resnet101_coco с этим конвейером конфигурации:

    model {
      faster_rcnn {
        num_classes: 10
        image_resizer {
          keep_aspect_ratio_resizer {
            min_dimension: 600
            max_dimension: 1024
          }
        }
        feature_extractor {
          type: 'faster_rcnn_resnet101'
          first_stage_features_stride: 16
        }
        first_stage_anchor_generator {
          grid_anchor_generator {
            scales: [0.25, 0.5, 1.0, 2.0]
            aspect_ratios: [0.5, 1.0, 2.0]
            height_stride: 16
            width_stride: 16
          }
        }
        first_stage_box_predictor_conv_hyperparams {
          op: CONV
          regularizer {
            l2_regularizer {
              weight: 0.0
            }
          }
          initializer {
            truncated_normal_initializer {
              stddev: 0.01
            }
          }
        }
        first_stage_nms_score_threshold: 0.0
        first_stage_nms_iou_threshold: 0.7
        first_stage_max_proposals: 300
        first_stage_localization_loss_weight: 2.0
        first_stage_objectness_loss_weight: 1.0
        initial_crop_size: 14
        maxpool_kernel_size: 2
        maxpool_stride: 2
        second_stage_box_predictor {
          mask_rcnn_box_predictor {
            use_dropout: false
            dropout_keep_probability: 1.0
            fc_hyperparams {
              op: FC
              regularizer {
                l2_regularizer {
                  weight: 0.0
                }
              }
              initializer {
                variance_scaling_initializer {
                  factor: 1.0
                  uniform: true
                  mode: FAN_AVG
                }
              }
            }
          }
        }
        second_stage_post_processing {
          batch_non_max_suppression {
            score_threshold: 0.0
            iou_threshold: 0.6
            max_detections_per_class: 100
            max_total_detections: 300
          }
          score_converter: SOFTMAX
        }
        second_stage_localization_loss_weight: 2.0
        second_stage_classification_loss_weight: 1.0
      }
    }
    
    train_config: {
      batch_size: 1
      optimizer {
        momentum_optimizer: {
          learning_rate: {
            manual_step_learning_rate {
              initial_learning_rate: 0.0003
              schedule {
                step: 900000
                learning_rate: .00003
              }
              schedule {
                step: 1200000
                learning_rate: .000003
              }
            }
          }
          momentum_optimizer_value: 0.9
        }
        use_moving_average: false
      }
      gradient_clipping_by_norm: 10.0
      fine_tune_checkpoint: "/home/franciszek/Pobrane/models-master/research/object_detection/logo_detection/models2/faster_rcnn_resnet101_coco/model.ckpt"
      from_detection_checkpoint: true
      data_augmentation_options {
        random_horizontal_flip {
        }
      }
    }
    
    train_input_reader: {
      tf_record_input_reader {
        input_path: "/home/franciszek/Pobrane/models-master/research/object_detection/logo_detection/data2/train.record"
      }
      label_map_path: "/home/franciszek/Pobrane/models-master/research/object_detection/logo_detection/data2/label_map.pbtxt"
    }
    
    eval_config: {
      num_examples: 8000
      # Note: The below line limits the evaluation process to 10 evaluations.
      # Remove the below line to evaluate indefinitely.
      max_evals: 10
    }
    
    eval_input_reader: {
      tf_record_input_reader {
        input_path: "/home/franciszek/Pobrane/models-master/research/object_detection/logo_detection/data2/test.record"
      }
      label_map_path: "/home/franciszek/Pobrane/models-master/research/object_detection/logo_detection/data2/label_map.pbtxt"
      shuffle: false
      num_readers: 1
    }
    

Здесь вы можете увидеть результаты, которые я получаю после тренировок в течение почти 23 часов и достижения более 120 000 шагов:

Итак, мой вопрос: почему величина потерь увеличивается со временем? Оно должно уменьшаться или оставаться более или менее постоянным, но вы можете ясно увидеть тенденцию к увеличению на графиках выше. Я думаю, что все правильно настроено, и мой набор данных довольно приличный (также файлы .tfrecord были правильно "собраны").

Чтобы проверить, не виноват ли я, я попытался использовать чужой набор данных и файлы конфигурации. Поэтому я использовал файлы racoon datase автора (он предоставил все необходимые файлы на своем репо ). Я просто скачал их и начал тренироваться без каких-либо модификаций, чтобы проверить, получу ли я такие же результаты, как у него.

Удивительно, но после 82 тыс. Шагов я получил совершенно другие диаграммы, чем те, которые показаны в связанной статье (которые были захвачены после 22 тыс. Шагов). Здесь вы можете увидеть сравнение наших результатов:

Понятно, что на моем компьютере что-то работает иначе. Я подозреваю, что это может быть той же самой причиной, почему я получаю растущие потери в своем собственном наборе данных, поэтому я упомянул об этом.

1 Ответ

0 голосов
/ 05 мая 2019

totalLoss - взвешенная сумма этих четырех других потерь.(Потери RPN cla и reg, потери BoxCla cla и reg) и все они Оценочные потери .На тензорной доске вы можете установить или снять флажок, чтобы увидеть результаты оценки только для обучения или только для оценки.(Например, на следующем рисунке представлены сводка поездов и сводная оценка)

enter image description here

Если потери при оценке возрастают, это может означать, что, помимометрики точности немного упали.

Чтобы получить лучший результат точной настройки, вы можете попробовать откорректировать веса четырех потерь, например, вы можете увеличить вес на BoxClassifierLoss/classification_loss, чтобыМодель ориентирована на эту метрику лучше.В вашем конфигурационном файле вес потери для second_stage_classification_loss_weight и first_stage_objectness_loss_weight равен 1, в то время как остальные два равны 2, поэтому модель в настоящее время сфокусирована на двух других.

Дополнительный вопрос опочему loss_1 и loss_2 одинаковы.Это можно объяснить, посмотрев на график тензорного потока.

enter image description here

Здесь loss_2 - сводка для total_loss (обратите внимание, что total_loss нето же самое, что и в totalLoss), а узел с красным кружком является узлом tf.identity.Этот узел выведет тот же тензор, что и вход, поэтому loss_1 совпадает с loss_2

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