【问题标题】:Tensorflow gradients张量流梯度
【发布时间】:2016-08-20 20:21:10
【问题描述】:

我正在尝试调整 tf DeepDream 教程代码以使用另一个模型。现在当我调用 tf.gradients() 时:

t_grad = tf.gradients(t_score, t_input)[0]
g      = sess.run(t_grad, {t_input:img0})

我收到一个类型错误:

TypeError: Fetch argument None of None has invalid type <type 'NoneType'>,     
must be a string or Tensor. (Can not convert a NoneType into a Tensor or 
Operation.)

我什至应该从哪里开始寻找解决此错误的方法?

是否可以将 tf.gradients() 与具有优化器的模型一起使用?

【问题讨论】:

  • sess.run 是否期望一个列表作为第一个参数,而你给了它一个张量?
  • 这是个好主意。我也以 [t_grad] 作为参数进行了尝试。我得到了同样的结果。

标签: tensorflow gradient


【解决方案1】:

以下是调试tf.gradients()的有用提示

对于无效的张量对:

grads = tf.gradients(<a tensor>, <another tensor that doesn't depend on the first>)

即使在您尝试在会话中运行 tf.gradients 之前,您也可以看到使用 print 是无效的

print grads

它将返回 [None] 一个列表,其中包含一个 None

如果你还是尝试在会话中运行它:

results = sess.run(grads) 

您不会再次收到None,而是收到问题中描述的错误消息。

对于一对有效的张量:

grads = tf.gradients(<a tensor>, <a related tensor>)
print grads 

你会得到类似的东西:

Tensor("gradients_1/sub_grad/Reshape:0", dtype=float32)

在一个有效的情况下:

results = sess.run(grads, {<appropriate feeds>})
print results

你会得到类似的东西

[array([[ 4.97156498e-06, 7.87349381e-06, 9.25197037e-06, ..., 8.72526925e-06, 6.78442757e-06, 3.85240173e-06], [ 7.72772819e-06, 9.26370740e-06, 1.19129227e-05, ..., 1.27088233e-05, 8.76379818e-06, 6.00637532e-06], [ 9.46506498e-06, 1.10620931e-05, 1.43903117e-05, ..., 1.40718612e-05, 1.08670165e-05, 7.12365863e-06], ..., [ 1.03536004e-05, 1.03090524e-05, 1.32107480e-05, ..., 1.40605653e-05, 1.25974075e-05, 8.90011415e-06], [ 9.69486427e-06, 8.18045282e-06, 1.12702282e-05, ..., 1.32554378e-05, 1.13317501e-05, 7.74569162e-06], [ 5.61043908e-06, 4.93397192e-06, 6.33513537e-06, ..., 6.26539259e-06, 4.52598442e-06, 4.10689108e-06]], dtype=float32)]

【讨论】:

  • 事实证明,我提供了适当的提要,因此实际上没有渐变,这就是为什么我没有得到。为了解决这个问题,我刚刚提供了适当的提要并且它起作用了。我还遇到过使用 tensorflow 变量范围引起的其他类似情况。为了解决其他问题,我仔细使用了 tf.variable_scope.reuse_variables()。希望对您有所帮助。
  • 这是类似的情况,其中不适当的提要导致无!谢谢。
  • 什么是“不适当的提要”?
  • 我要求的张量和我传递给 feed_dict 的值之间没有梯度链。
【解决方案2】:

我猜你的t_grad 有一些Nones。 None 在数学上等价于 0 梯度,但是当成本不依赖于它所区分的参数时,它会在特殊情况下返回。我们不只返回 0 而不是 None 的原因有很多,您可以在讨论中看到 here

因为None 在上述情况下可能很烦人,或者在计算二阶导数时,我使用下面的辅助函数

def replace_none_with_zero(l):
  return [0 if i==None else i for i in l] 

【讨论】:

  • 谢谢,这对调试很有帮助。似乎tf.gradients() 只返回了一个None。在深梦教程中,t_score = tf.reduce_mean(&lt;a tensor&gt;),一个标量值。我没有从原始代码更改t_input。我打电话给 t_score = tf.reduce_mean(&lt;my tensor&gt;)tf.gradients(t_score, t_input) ,我仍然得到同样的错误,因为如果我使用你的帮助函数,tf.gradients() 返回单个 None 或单个 0。在我看来,我所做的只是将一个标量替换为另一个标量,但它在本教程中有效,但不适用于我。
  • 这意味着您替换的标量不依赖于被区分的变量 (tf.trainable_variables()),因此梯度为 0
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多