Как создать оптимизатор в Tensorflow

python python-2.7 optimization tensorflow mathematical-optimization

13271 просмотра

2 ответа

121 Репутация автора

Я хочу написать новый алгоритм оптимизации для моей сети на Tensorflow. Я надеюсь реализовать алгоритм оптимизации Левенберга Марквардта , который теперь исключен из TF API. Я нашел плохую документацию о том, как написать собственный оптимизатор, поэтому я спрашиваю, может ли кто-нибудь дать мне какой-либо совет. Благодарю.

Автор: Alberto Manzini Источник Размещён: 18.07.2016 07:37

Ответы (2)


16 плюса

19023 Репутация автора

Простейшим примером оптимизатора является, вероятно, оптимизатор градиентного спуска . Он показывает, как создать экземпляр базового класса оптимизатора . Документация базового класса оптимизатора объясняет, что делают методы.

Python-сторона оптимизаторов добавляет новые узлы в граф, которые вычисляют и применяют обратные градиенты. Он предоставляет параметры, которые передаются операциям, и выполняет некоторые функции управления оптимизатором на высоком уровне. Затем вам нужно ввести «Применить».

У Ops есть и компонент Python, и компонент C ++. Написание обучающей операции такое же (но специализированное), как и общий процесс добавления операции в TensorFlow .

Пример набора обучающих операций, которые вычисляют и применяют градиенты, смотрите в python / training / training_ops.py - это клей Python для фактических обучающих операций. Обратите внимание, что код здесь в основном касается вывода формы - вычисления будут выполняться в C ++.

Фактическая математика для применения градиентов обрабатывается операцией (напоминая, что, как правило, операции написаны на C ++). В этом случае операции применения градиентов определены в core / kernels / training_ops.cc . Например, вы можете увидеть реализацию ApplyGradientDescentOp, которая ссылается на функтор ApplyGradientDescent:

var.device(d) -= grad * lr();

Реализация самой операции следует за реализацией любой другой операции, как описано в документации на добавление.

Автор: dga Размещён: 18.07.2016 10:03

10 плюса

111 Репутация автора

Перед запуском сеанса Tensorflow следует запустить оптимизатор, как показано ниже:

# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

tf.train.GradientDescentOptimizer является объектом класса GradientDescentOptimizer и, как следует из названия, реализует алгоритм градиентного спуска.

Метод minimal () вызывается с параметром «стоимость» и состоит из двух методов: compute_gradients () и apply_gradients () .

Для большинства (пользовательских) реализаций оптимизатора метод apply_gradients () должен быть адаптирован.

Этот метод основан на (новом) Оптимизаторе (классе), который мы создадим, чтобы реализовать следующие методы: _create_slots (), _prepare (), _apply_dense () и _apply_sparse () .

  • _create_slots () и _prepare () создают и инициализируют дополнительные переменные, такие как импульс.

  • _apply_dense () и _apply_sparse () реализуют фактические операции, которые обновляют переменные.

Операции обычно написаны на C ++. Без необходимости самостоятельно изменять заголовок C ++, вы все равно можете вернуть оболочку Python некоторых Ops через эти методы. Это делается следующим образом:

def _create_slots(self, var_list):
   # Create slots for allocation and later management of additional 
   # variables associated with the variables to train.
   # for example: the first and second moments.
   '''
   for v in var_list:
      self._zeros_slot(v, "m", self._name)
      self._zeros_slot(v, "v", self._name)
   '''
def _apply_dense(self, grad, var):
   #define your favourite variable update
    # for example:
   '''
   # Here we apply gradient descents by substracting the variables 
   # with the gradient times the learning_rate (defined in __init__)
   var_update = state_ops.assign_sub(var, self.learning_rate * grad) 
   '''
   #The trick is now to pass the Ops in the control_flow_ops and 
   # eventually groups any particular computation of the slots your 
   # wish to keep track of:
   # for example:    
   '''
    m_t = ...m... #do something with m and grad
    v_t = ...v... # do something with v and grad
    '''
  return control_flow_ops.group(*[var_update, m_t, v_t])

Для более подробного объяснения с примером, см. Этот пост в блоге https://www.bigdatarepublic.nl/custom-optimizer-in-tensorflow/

Автор: Benoit Descamps Размещён: 16.11.2017 01:53
Вопросы из категории :
32x32