如何在Tensorflow中创建优化器
optimization
python
python-2.7
tensorflow
6
0

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

在运行Tensorflow会话之前,应启动优化器 ,如下所示:

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

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

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

对于大多数(自定义)优化器实施,需要修改apply_gradients()方法。

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

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

  • _apply_dense()_apply_sparse()实现实际的操作,该操作会更新变量。

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/

收藏
评论

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

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

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

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

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

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

Op本身的实现遵循在add-an-op文档中所述的任何其他op的实现。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号