Низкие потери при обучении и проверке, но также низкая карта при более быстром R-CNN в наборе данных Mapillary

#python #tensorflow #deep-learning #object-detection #faster-rcnn

#python #тензорный поток #глубокое обучение #обнаружение объекта #быстрее-rcnn

Вопрос:

Я новичок в глубоком обучении, я использую API обнаружения объектов Tensorflow 2 для точной настройки более быстрой модели R-CNN (предварительно обученной на наборе данных COCO 2017) в наборе данных Mapillary для обнаружения дорожных знаков. Набор данных содержит 36589 изображений в обучающем наборе (с 180287 ограничивающими рамками) и 5320 изображений в наборе проверки (с 26101 ограничивающими рамками).

Но я испытываю странное поведение: потери при обучении и проверке, похоже, сходятся (я также пытаюсь использовать разные скорости обучения), но карта остается 0.

Используя следующую конфигурацию:

 # Faster R-CNN with Resnet-50 (v1)
# Trained on COCO, initialized from Imagenet classification checkpoint

# This config is TPU compatible.

model {
  faster_rcnn {
    num_classes: 314
    image_resizer {
      keep_aspect_ratio_resizer {
        min_dimension: 1024
        max_dimension: 1024
        pad_to_max_dimension: true
      }
    }
    feature_extractor {
      type: 'faster_rcnn_resnet101_keras'
      batch_norm_trainable: false #fine-tuning: false | from-scratch: true
    }
    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 #no regularization?
        }
      }
      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 #no regularization?
            }
          }
          initializer {
            variance_scaling_initializer {
              factor: 1.0
              uniform: true
              mode: FAN_AVG
            }
          }
        }
        share_box_across_classes: false #it should'nt be needed in this case since a box has only one class
      }
    }
    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 #applies SOFTMAX on input detection scores
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
    use_static_shapes: true
    use_matmul_crop_and_resize: true
    clip_anchors_to_image: true
    use_static_balanced_label_sampler: true
    use_matmul_gather_in_matcher: true
  }
}

train_config: {
  batch_size: 1
  sync_replicas: true
  startup_delay_steps: 0
  replicas_to_aggregate: 8
  num_steps: 10000
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        cosine_decay_learning_rate {
          learning_rate_base: .0000004
          total_steps: 10000
          warmup_learning_rate: .000000133
          warmup_steps: 2000
        }
      }
      momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }

  add_regularization_loss: true
  fine_tune_checkpoint_version: V2
  fine_tune_checkpoint: "pretrained-model/faster_rcnn_resnet101_v1_1024x1024_coco17_tpu-8/checkpoint/ckpt-0"
  fine_tune_checkpoint_type: "detection"

#  data_augmentation_options {
#    random_horizontal_flip {
#    }
#  }
#  data_augmentation_options {
#    random_adjust_hue {
#    }
#  }
#  data_augmentation_options {
#    random_adjust_contrast {
#    }
#  }
#  data_augmentation_options {
#    random_adjust_saturation {
#    }
#  }
#  data_augmentation_options {
#     random_square_crop_by_scale {
#      scale_min: 0.6
#      scale_max: 1.3
#    }
#  }

  #merge_multiple_label_boxes: false
  max_number_of_boxes: 206388 #this is the total number considering the entire dataset
  unpad_groundtruth_tensors: false
  use_bfloat16: false  # works only on TPUs
}

train_input_reader: {
  label_map_path: "data/training/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "data/training/train.tfrecord"
  }
}

eval_config: {
  min_score_threshold: 0.5
  batch_size: 1
  #num_examples: 100
  num_visualizations: 10
  metrics_set: "pascal_voc_detection_metrics"
  use_moving_averages: false
  eval_interval_secs: 30
  #max_evals: 10
  include_metrics_per_category: true
}

eval_input_reader: {
  label_map_path: "data/validation/label_map.pbtxt"
  shuffle: false
  num_epochs: 1
  tf_record_input_reader {
    input_path: "data/validation/train.tfrecord"
  }
}
  

Я получаю следующий результат:
графики тензорной доски

но все карты равны 0 (всего и по категориям).

Принимая во внимание, что, изменив базовую скорость обучения на .00000004 и скорость обучения при прогреве на .0000000133, размер пакета равен 8, а число шагов равно 50000, я получаю следующий результат (он все еще обучается): Графики тензорной доски 2

Производительность по категориям равна 0, но общая карта, похоже, начинает немного улучшаться, но все еще очень низкая: общая карта pascal

Я полагаю, что такое поведение может быть вызвано некоторыми неправильными гиперпараметрами. Должен ли я что-то изменить в файле конфигурации? Также, как вы думаете, какая конфигурация была бы лучшей между ними?

Примечание: перед использованием всего набора данных я обучил модель на очень маленьком наборе данных (с более высокой скоростью обучения) и, используя тот же набор данных для оценки модели, он работал довольно хорошо (но, вероятно, он был перегружен). Включение всего набора данных приводит к этому странному поведению.

Комментарии:

1. Я думаю, вы можете увеличить скорость обучения. В файлах конфигурации по умолчанию значения скорости обучения часто составляют 0,04 и 0,0133 для скорости прогрева из того, что я видел.

2. спасибо за ваш ответ, я также пытался использовать более высокие скорости обучения, но потери сильно колебались, и я подумал, что это будет признаком слишком высокой скорости обучения.

3. Это нормально, что они колеблются в начале, особенно если вы все еще находитесь на стадии прогрева. Если скорость обучения действительно слишком велика, у вас может возникнуть ошибка с исчезновением градиента, т. Е. Веса и потери становятся миллионами. Результаты также могут быть хуже, но вам нужно немного попробовать.

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