如何在tf.clip_by_global_norm中处理None?

时间:2018-04-23 18:38:06

标签: python-3.x tensorflow deep-learning

我已经读过this question here的答案,tf.clip_by_global_norm()通过简单地忽略它们来处理无值(danijar在@danijar对答案的评论中评论)但是当我尝试应用它时我似乎做错了,因为它抛出

ValueError:不支持任何值。

tf.reset_default_graph()
z = tf.get_variable(name = 'z', shape = [1])
b = tf.get_variable('b', [1])
c = b*b - 2*b + 1
optimizer = tf.train.AdamOptimizer(0.1)
gradients, variables = zip(*optimizer.compute_gradients(c))
gradients = tf.clip_by_global_norm(gradients, 2.5)
train_op = optimizer.apply_gradients(zip(gradients, variables))

有人可以告诉我,我做错了什么,或者tf.clip_by_global_norm()不处理无渐变,我必须手动处理它们

官方文件似乎同意@ danijar的评论。见here

  

忽略任何类型为None的t_list条目。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一个小问题:当此函数返回一对值时,您将tf.clip_by_global_norm的返回值分配给单个变量。

文档说:

  

返回:

     

list_clipped:与list_t相同类型的张量列表。

     

global_norm:表示全局范数的0-D(标量)张量。

因此,当您尝试将渐变应用于变量时,问题出现在下一行中。

您可以轻松修复代码,忽略global_norm返回值。

gradients, _ = tf.clip_by_global_norm(gradients, 2.5)