繁体   English   中英

如何在Tensorflow中创建优化器

[英]How to create an optimizer in Tensorflow

我想在Tensorflow上为我的网络编写一个新的优化算法。 我希望实现Levenberg Marquardt优化算法 ,该算法现在被排除在TF API之外。 我发现关于如何编写自定义优化器的文档很差,所以我问是否有人可以给我任何建议。 谢谢。

优化器的最简单示例可能是梯度下降优化器 它显示了如何创建基本优化器类的实例。 优化器基类文档说明了这些方法的作用。

优化器的python端向图中添加了新节点,用于计算和应用反向传播的渐变。 它提供了传递给ops的参数,并对优化器进行了一些高级管理。 然后,您需要实际的“应用”操作。

Ops有python和C ++组件。 编写训练操作与将操作添加到TensorFlow一般过程相同(但是专门)。

有关计算和应用渐变的一组示例训练操作,请参阅python / training / training_ops.py - 这是实际训练操作的Python粘合剂。 请注意,这里的代码主要是关于形状推断 - 计算将在C ++中进行。

应用渐变的实际数学运算由Op处理(回想一下,ops是用C ++编写的)。 在这种情况下,应用渐变操作在core / kernels / training_ops.cc中定义。 例如,你可以看到ApplyGradientDescentOp的实现,它引用了一个仿函数ApplyGradientDescent:

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

Op本身的实现遵循add-an-op docs中描述的任何其他op的实现。

在运行Tensorflow会话之前,应该启动Optimizer ,如下所示:

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

tf.train.GradientDescentOptimizerGradientDescentOptimizer类的一个对象,顾名思义,它实现了梯度下降算法。

该方法最小化()是被称为与“成本”作为参数,由这两种方法compute_gradients(),然后apply_gradients(。

对于大多数(自定义)优化器实现,需要调整apply_gradients()方法。

此方法依赖于我们将创建的(新)优化器(类)来实现以下方法: _create_slots(),_ prepare(),_ apply_dense()和_apply_sparse()

  • _create_slots()_prepare()创建并初始化其他变量,例如动量。

  • _apply_dense()_apply_sparse()实现更新变量的实际Ops。

Ops通常用C ++编写。 无需自己更改C ++标头,您仍然可以通过这些方法返回一些Ops的python包装器。 这样做如下:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM