【问题标题】:Implementing gradient descent in TensorFlow instead of using the one provided with it在 TensorFlow 中实现梯度下降,而不是使用它提供的梯度下降
【发布时间】:2018-04-22 21:10:54
【问题描述】:

我想在 TensorFlow 中构建分类器时使用带有动量的梯度下降(跟踪先前的梯度)。

所以我不想使用tensorflow.train.GradientDescentOptimizer,但我想使用tensorflow.gradients 来计算梯度并跟踪先前的梯度并根据所有梯度更新权重。

如何在 TensorFlow 中执行此操作?

【问题讨论】:

  • 您是否考虑过使用AdamOptimizerRMSPropOptimizer

标签: tensorflow gradient-descent


【解决方案1】:

TensorFlow 有一个implementation 的梯度下降和动量。

为了回答您关于实现自己的优化算法的一般问题,TensorFlow 为您提供了计算梯度的原语,并使用计算出的梯度更新变量。在您的模型中,假设 loss 指定损失函数,var_list 是模型中 TensorFlow 变量的 python 列表(您可以通过调用 tf.all_variablestf.trainable_variables 来获得,然后您可以计算梯度 w.r.t变量如下:

grads = tf.gradients(loss, var_list)

对于简单的梯度下降,您只需从变量中减去梯度和学习率的乘积。代码如下所示:

var_updates = []
for grad, var in zip(grads, var_list):
  var_updates.append(var.assign_sub(learning_rate * grad))
train_op = tf.group(*var_updates)

您可以通过调用sess.run(train_op) 来训练您的模型。现在,您可以在实际更新变量之前做各种事情。例如,您可以跟踪一组不同变量中的梯度并将其用于动量算法。或者,您可以在更新变量之前剪裁渐变。所有这些都是简单的 TensorFlow 操作,因为梯度张量与您在 TensorFlow 中计算的其他张量没有什么不同。请查看一些更高级的优化算法的实现(MomentumRMSPropAdam),以了解如何实现自己的优化算法。

【讨论】:

  • 它可以工作,但有点困惑。我正在对 mnist 数据拟合 softmax 回归。所以我希望 tf.all_variables 生成一个包含两个张量的列表,1 x 10 用于偏差,784 x 10 用于权重。但它会生成一个包含 120 个(每次运行脚本时这个数字也会不断增加)张量的列表,其中 60 个是 1 x 10 张量,60 个是 784 x 10 张量。你能帮我理解 tf.all_variables 发生了什么吗?
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2012-05-22
  • 2015-07-10
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多