Почему скорость обучения не меняется? - PullRequest
0 голосов
/ 16 апреля 2019

Я использую учебное руководство по API обнаружения объектов Tensorflow https://tensorflow -object-detection-api-tutorial.readthedocs.io / en / latest / index.html для обучения моей пользовательской модели.Следуйте этой инструкции, для обучения я использовал конфигурационный файл из официального репозитория GitHub и скрипт train.py.Я видел в файле конфигурации, что скорость обучения должна быть адаптивной.Это можно увидеть в следующих строках:

train_config: {
  batch_size: 24
  optimizer {
    rms_prop_optimizer: {
      learning_rate: {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.004
          decay_steps: 800720
          decay_factor: 0.95
        }
      }
      momentum_optimizer_value: 0.9
      decay: 0.9
      epsilon: 1.0
    }
  }

Затем я использовал TensorBoard во время тренировки, и она показала мне, что скорость обучения постоянна для каждого шага тренировки.Почему это происходит?Может быть, TensorBoard видит только начальное значение скорости обучения, а оптимизатор вычисляет его реальное значение на лету?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

В API оптимизатор был встроен в этот файл это это строка для rms_prop_optimizer.Чтобы построить скорость обучения оптимизатора, функция вызвала функцию _create_learning_rate, которая в конечном итоге вызвала learning_schedules в object_detection/utils.А вот как в вашем примере запланирована скорость обучения.

def exponential_decay_with_burnin(global_step,
                                  learning_rate_base,
                                  learning_rate_decay_steps,
                                  learning_rate_decay_factor,
                                  burnin_learning_rate=0.0,
                                  burnin_steps=0,
                                  min_learning_rate=0.0,
                                  staircase=True):
  """Exponential decay schedule with burn-in period.
  In this schedule, learning rate is fixed at burnin_learning_rate
  for a fixed period, before transitioning to a regular exponential
  decay schedule.
  Args:
    global_step: int tensor representing global step.
    learning_rate_base: base learning rate.
    learning_rate_decay_steps: steps to take between decaying the learning rate.
      Note that this includes the number of burn-in steps.
    learning_rate_decay_factor: multiplicative factor by which to decay
      learning rate.
    burnin_learning_rate: initial learning rate during burn-in period.  If
      0.0 (which is the default), then the burn-in learning rate is simply
      set to learning_rate_base.
    burnin_steps: number of steps to use burnin learning rate.
    min_learning_rate: the minimum learning rate.
    staircase: whether use staircase decay.
  Returns:
    a (scalar) float tensor representing learning rate
  """
  if burnin_learning_rate == 0:
    burnin_learning_rate = learning_rate_base
  post_burnin_learning_rate = tf.train.exponential_decay(
      learning_rate_base,
      global_step - burnin_steps,
      learning_rate_decay_steps,
      learning_rate_decay_factor,
      staircase=staircase)
  return tf.maximum(tf.where(
      tf.less(tf.cast(global_step, tf.int32), tf.constant(burnin_steps)),
      tf.constant(burnin_learning_rate),
      post_burnin_learning_rate), min_learning_rate, name='learning_rate')

А вот график снижения скорости обучения.Даже после 100 000 шагов затухание на самом деле очень мало.enter image description here

2 голосов
/ 16 апреля 2019

Из документации, которую я прочитал, формула для расчета скорости затухания:

decayed_learning_rate = learning_rate *
                    decay_rate ^ (global_step / decay_steps)

В этом global_step нужно указывать в соответствии с:

[...] requires a global_step value to compute the decayed learning rate.
You can just pass a TensorFlow variable that you increment at each training step.

ТАК, возможно, вам просто нужнопередать этот параметр global_step для эффективного снижения скорости?

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