2016-04-26 89 views
4

我正在尝试调整tf DeepDream教程代码以与另一个模型一起使用。现在,当我打电话tf.gradients():Tensorflow渐变

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()与其中包含优化器的模型一起使用?

+0

是不是sess.run期待列表作为第一个参数,并且给它一个张量? – Aaron

+0

这是一个很好的想法。我也以[t_grad]为参数进行了尝试。我也有同样的结果。 – apfalz

回答

5

我猜你的t_grad有一些None s。 None在数学上等同于0渐变,但在成本不依赖于与其区分的参数相关的特殊情况下返回。有各种各样的原因,我们不只是返回0,而不是None你可以在讨论中看到here

因为None可以像上述情况是恼人的,或计算二阶导数的时候,我用下面

辅助函数
def replace_none_with_zero(l): 
    return [0 if i==None else i for i in l] 
2

以下是有用的提示用于调试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)]

+0

您是如何解决问题的? – rafaelvalle

+0

事实证明,我提供了一个适当的饲料,所以实际上没有梯度,这就是为什么我没有得到。为了解决这个问题,我只提供了合适的提要并且工作。我有使用tensorflow变量作用域的其他类似情况。为了解决这些其他问题,我小心使用了tf.variable_scope.reuse_variables()。希望有所帮助。 – apfalz

+0

这就是类似的情况,其中不适当的Feed会导致无!谢谢。 – rafaelvalle