函数渐变与张量流中的聚集操作

时间:2018-05-11 23:44:54

标签: python tensorflow differentiation

我正在尝试使用张量流编写复杂的计算图,并根据函数参数计算符号梯度。 但是当我的函数/图形涉及收集某些参数的操作时,我正在努力解决这个问题。问题是Session.run返回的渐变不仅仅是张量,而是IndexedSlices对象。而且我不知道如何正确地将其转换为张量。

这是一个说明问题的玩具示例

import tensorflow as tf
import numpy as np
from tensorflow.python.ops import gradients_impl as GI

T_W = tf.placeholder(tf.float32, [2], 'W') # parameter vector
T_data = tf.placeholder(tf.float32, [10], 'data') # data vector
T_Di = tf.placeholder(tf.int32, [10], 'Di') # indices vector
T_pred = tf.gather(T_W,T_Di)
T_loss = tf.reduce_sum(tf.square(T_data-T_pred)) # loss function

T_grad = tf.gradients(T_loss,[T_W])
#T_grad=GI._IndexedSlicesToTensor(T_grad)                                       

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    feed_dict={T_W: [1.,2.],
           T_data: np.arange(10)**2,
           T_Di: np.arange(10)%2}
    dl, dgrad = sess.run(
    [T_loss, T_grad], feed_dict=feed_dict)
    grad = np.array(dgrad)
    print (grad)

哪个输出

[[array([   4.,    4.,   -4.,  -12.,  -28.,  -44.,  -68.,  -92., -124.,
   -156.], dtype=float32)
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=int32)
array([2], dtype=int32)]]

这里,我得到的是indexedSlices对象,而不是一个应该是两个元素的矢量的渐变。

我看到内部模块tensorflow.python.ops.gradients_impl有一些内部转换器_indexedSlicesToTensor,但我觉得很奇怪,没有官方的'将渐变作为张量的方法。在theano中,例如没有这样的问题。

1 个答案:

答案 0 :(得分:0)

答案很简单。我只需要使用tf.convert_to_tensor()函数

T_grad = tf.gradients(T_loss,[T_W])
T_grad = tf.convert_to_tensor(T_grad[0])