API обнаружения объектов TensorFlow оценивает эффективность обучения - PullRequest
2 голосов
/ 08 октября 2019

Я использую API обнаружения объектов Tensorflow в своем собственном наборе данных. Во время обучения я хочу знать, насколько хорошо NN учится на тренировочном наборе. Итак, я хочу провести оценку как на тренировочном, так и на тестовом наборе и получить точность (mAP) соответственно во время тренировочных сессий.

Мой файл конфигурации:

model {
  faster_rcnn {
    num_classes: 50
    image_resizer {
      fixed_shape_resizer {
        height: 960
        width: 960
      }
    }
    number_of_stages: 3
    feature_extractor {
      type: 'faster_rcnn_resnet101'
      first_stage_features_stride: 8
    }
    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: 8
        width_stride: 8
      }
    }
    first_stage_atrous_rate: 2
    first_stage_box_predictor_conv_hyperparams {
      op: CONV
      regularizer {
        l2_regularizer {
          weight: 0.0
        }
      }
      initializer {
        truncated_normal_initializer {
          stddev: 0.00999999977648
        }
      }
    }
    first_stage_nms_score_threshold: 0.0
    first_stage_nms_iou_threshold: 0.699999988079
    first_stage_max_proposals: 100
    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
            }
          }
        }
        conv_hyperparams {
          op: CONV
          regularizer {
            l2_regularizer {
              weight: 0.0
            }
          }
          initializer {
            truncated_normal_initializer {
              stddev: 0.00999999977648
            }
          }
        }
        predict_instance_masks: true
        mask_height: 33
        mask_width: 33
        mask_prediction_conv_depth: 0
        mask_prediction_num_conv_layers: 4
      }
    }
    second_stage_post_processing {
      batch_non_max_suppression {
        score_threshold: 0.300000011921
        iou_threshold: 0.600000023842
        max_detections_per_class: 100
        max_total_detections: 100
      }
      score_converter: SOFTMAX
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
    second_stage_mask_prediction_loss_weight: 4.0
  }
}
train_config: {
  batch_size: 1
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: 0.003
          schedule {
            step: 3000
            learning_rate: 0.00075
          }
          schedule {
            step: 6000
            learning_rate: 0.000300000014249
          }
          schedule {
            step: 15000
            learning_rate: 0.000075
          }
          schedule {
            step: 18000
            learning_rate: 0.0000314249
          }
          schedule {
            step: 900000
            learning_rate: 2.99999992421e-05
          }
          schedule {
            step: 1200000
            learning_rate: 3.00000010611e-06
          }
        }
      }
      momentum_optimizer_value: 0.899999976158
    }
    use_moving_average: false
  }
  gradient_clipping_by_norm: 10.0
  fine_tune_checkpoint: "./mask_rcnn_resnet101_atrous_coco/model.ckpt"
  from_detection_checkpoint: true
  num_steps: 200000
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
}
train_input_reader: {
  label_map_path: "./map901_label_map.pbtxt"
  load_instance_masks: true
  mask_type: PNG_MASKS
  tf_record_input_reader {
    input_path: ["./my_coco_train.record-?????-of-00005"]
  }
}
eval_config: {
  num_examples: 8000
  max_evals: 100
  num_visualizations: 25
}
eval_input_reader: {
  label_map_path: "./map901_label_map.pbtxt"
  shuffle: false
  load_instance_masks: true
  mask_type: PNG_MASKS
  num_readers: 1
  tf_record_input_reader {
    input_path: ["./my_coco_val.record-?????-of-00001"]
  }
}

Я запустил скрипт с этими параметрами

python model_main.py --alsologtostderr \
  --pipeline_config_path=${PIPELINE_CONFIG_PATH} \
  --model_dir=${TRAIN_DIR} \
  --num_train_steps=24000 \
  --sample_1_of_n_eval_on_train_examples=25 \
  --num_eval_steps=100 \
  --sample_1_of_n_eval_examples=1 

Я думаю, что это запустит оценку примеров Eval. Чтобы оценить данные обучения (чтобы проверить, сколько функций было получено в результате обучения), я добавил --eval_training_data=True к параметрам.

Я не могу добавить "eval_training_data" на ходу. Мне нужно провести 2 разные тренировки.

Интересно, что с добавленным параметром "eval_training_data" я получил,

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.165
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.281
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.167
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.051
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.109
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.202
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.164
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.202
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.202
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.057
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.141
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.236

Тогда как без "eval_training_data" я получил

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.168
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.283
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.173
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.049
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.108
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.208
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.170
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.208
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.208
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.056
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.139
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.248

Я просто запутался. Мои вопросы:

  1. Разве «eval_training_data» не вынуждает API обнаружения объекта запускать оценку на обучающем наборе?
  2. Почему в моем случае обе оценки почти одинаковы, а в некоторых случаях оценка лучше?
  3. Какие параметры нужно добавить, чтобы он оценивал и тренировку, и оценку, установленную отдельно во время тренировки, и печатал ее?

1 Ответ

2 голосов
/ 18 октября 2019

Из того, что я мог собрать, быстро рассмотрев репо, было:

  1. eval_training_data оценивает только на тренировочном наборе и исключает набор eval из процесса оценки. Так что он работает только на вашем тренировочном наборе.

  2. Одни и те же результаты - это не плохо. Это на самом деле хорошо и показывает, что ваша модель не перегружена, что было бы в случае, если бы оценки данных обучения были значительно выше, чем оценки для данных оценки. Более высокие оценки в некоторых случаях для оценки обусловлены тем, что это должен быть набор данных гораздо меньшего размера, и, следовательно, дроби могут значительно отличаться даже при нескольких хороших или плохих прогнозах. Кроме того, модель изучает функции и связывает их с классами, а не изучает примеры, поэтому не ожидайте, что она будет работать удивительно на тренировочном наборе, так как она видела все из них. Чем лучше ваша модель работает с проверочным набором, тем лучше он обобщается.

  3. Если вы включите eval_training_data = True, то на самом деле он уже отдельно оценивает обучающий набор и в случае, если он установлен на false(что по умолчанию), он оценивает только eval, установленный отдельно. Я не уверен, добавили ли они функцию для оценки обоих вместе, но вы можете сделать это с очень небольшим изменением в model_main.py. Просто сделай это дополнение. Это не чисто и не оптимизировано, но я думаю, что вы видите точку и можете изменить ее соответствующим образом.

flags.DEFINE_boolean('eval_training_data_and_eval_data', False,
                     'This will evaluate botht the training data and evaluation data sequentially')

  if FLAGS.checkpoint_dir:
    if FLAGS.eval_training_data_and_eval_data:

      name = 'training_data'
      input_fn = eval_on_train_input_fn
      if FLAGS.run_once:
        estimator.evaluate(input_fn,
                           steps=None,
                           checkpoint_path=tf.train.latest_checkpoint(
                               FLAGS.checkpoint_dir))
      else:
        model_lib.continuous_eval(estimator, FLAGS.checkpoint_dir, input_fn,
                                  train_steps, name)

      name = 'validation_data'
      # The first eval input will be evaluated.
      input_fn = eval_input_fns[0]
      if FLAGS.run_once:
        estimator.evaluate(input_fn,
                           steps=None,
                           checkpoint_path=tf.train.latest_checkpoint(
                               FLAGS.checkpoint_dir))
      else:
        model_lib.continuous_eval(estimator, FLAGS.checkpoint_dir, input_fn,
                                  train_steps, name)

  else:
    train_spec, eval_specs = model_lib.create_train_and_eval_specs(
        train_input_fn,
        eval_input_fns,
        eval_on_train_input_fn,
        predict_input_fn,
        train_steps,
        eval_on_train_data=False)

    # Currently only a single Eval Spec is allowed.
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_specs[0])

Также убедитесь, что вы предоставляете правильные и отличные пути для своего набора данных. ,Обратите внимание, что если мы оптимизировали гиперпараметры на основе балла валидации, балл валидации смещается и больше не является хорошей оценкой обобщения. Чтобы получить правильную оценку обобщения, мы должны вычислить оценку для другого набора тестов.

...