Я использую TensorFlow для обучения нейронной сети. Вот как я инициализирую GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
Дело в том, что я не знаю, как установить правило обновления для скорости обучения или значение спада для этого.
Как я могу использовать здесь адаптивную скорость обучения?
python
tensorflow
отображаемое имя
источник
источник
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Похоже, что установка новой скорости обучения требует инициализации модели с уже обученными переменными. Но не могу понять, как это сделать.Ответы:
Прежде всего,
tf.train.GradientDescentOptimizer
он предназначен для использования постоянной скорости обучения для всех переменных на всех этапах. TensorFlow также предоставляет готовые адаптивные оптимизаторы, в том числеtf.train.AdagradOptimizer
иtf.train.AdamOptimizer
, и их можно использовать в качестве замены.Однако, если вы хотите контролировать скорость обучения с помощью ванильного градиентного спуска, вы можете воспользоваться тем фактом, что
learning_rate
аргументомtf.train.GradientDescentOptimizer
конструктора может бытьTensor
объект. Это позволяет вам вычислять разные значения скорости обучения на каждом этапе, например:В качестве альтернативы вы можете создать скаляр
tf.Variable
, содержащий скорость обучения, и назначать его каждый раз, когда вы хотите изменить скорость обучения.источник
tf.clip_by_norm
не принимает тензор для нормы клипа, так как насчет того[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, чтобы сделать , где?ct = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, единственное, что мешает ему принимать тензор в качестве входных данных, так этоconstant_op.constant(1.0 / clip_norm)
. Замена этого выражения наmath_ops.inv(clip_norm)
заставит его работать с вводом-заполнителем (или любым другим тензором).)Tensorflow обеспечивает опы автоматически применять экспоненциальный распад с тензором скорости обучения:
tf.train.exponential_decay
. В качестве примера использования см. Эту строку в примере сверточной модели MNIST . Затем используйте предложение @ mrry выше, чтобы передать эту переменную в качестве параметра learning_rate выбранному оптимизатору.Ключевой отрывок, на который стоит обратить внимание:
Обратите внимание на
global_step=batch
параметр, который нужно минимизировать. Это говорит оптимизатору услужливо увеличивать параметр «партии» для вас каждый раз, когда он тренируется.источник
batch
называется ,global_step
и есть несколько функций , удобства, один для его созданияtf.train.create_global_step()
(который просто создает целоеtf.Variable
и добавляет его кtf.GraphKeys.GLOBAL_STEP
коллекции) иtf.train.get_global_step()
.Алгоритм градиентного спуска использует постоянную скорость обучения, которую вы можете обеспечить во время инициализации . Вы можете пройти различные уровни обучения так, как показал Mrry.
Но вместо него вы также можете использовать более продвинутые оптимизаторы, которые имеют более высокую скорость сходимости и адаптируются к ситуации.
Вот краткое объяснение, основанное на моем понимании:
Адам или адаптивный импульс - алгоритм, похожий на AdaDelta. Но помимо хранения скорости обучения для каждого из параметров, он также сохраняет изменения импульса для каждого из них отдельно.
Через несколько визуализаций :
источник
Из официальных документов tensorflow
источник
Если вы хотите установить определенные скорости обучения для интервалов эпох, например
0 < a < b < c < ...
. Затем вы можете определить скорость обучения как условный тензор, зависящий от глобального шага, и передать его как обычно оптимизатору.Вы можете добиться этого с помощью набора вложенных
tf.cond
операторов, но проще построить тензор рекурсивно:Затем, чтобы использовать его, вам нужно знать, сколько шагов обучения есть в одной эпохе, чтобы мы могли использовать глобальный шаг для переключения в нужный момент и, наконец, определить эпохи и скорость обучения, которые вы хотите. Поэтому, если мне нужны скорости обучения в
[0.1, 0.01, 0.001, 0.0001]
течение интервалов эпох[0, 19], [20, 59], [60, 99], [100, \infty]
соответственно, я бы сделал:источник