使用pfor的Tensorflow快速jacobian计算无法嵌入查找

时间:2018-11-02 00:40:25

标签: python tensorflow gradient

我正在尝试Tensorflow 1.10中的新实验功能,该功能是在快速的while循环实现中计算Jacobian。您可以找到代码和演示here。它称为parallel forpfor

AFIK,此新功能可用于高效地计算每个示例梯度,也就是未聚合的梯度。关于为什么我们可能需要herehere进行了广泛的讨论。

但是当我尝试使用它来计算每个示例的梯度以嵌入查找时,它未能通过某些断言,而且我不知道该如何解决。

下面是有关嵌入定义和使用jacobian

的代码段
# define embedding
input_embedding_mat = tf.get_variable("input_embedding_mat",
[vocabulary.vocab_size, args.num_hidden_units], dtype=tf.float32)
input_embedded = tf.nn.embedding_lookup(input_embedding_mat, x)
.....

# Sometime later when computing gradients for each variable
# loss_vector is a tensor containing loss respect to each input X 
# var_list if a list of variables. 
def fast_per_example_gradient(loss_vector, var_list):
    px_grads = []
    for var in var_list:
        print("loss_vector:{}".format(loss_vector))
        print("var:{}".format(var))
        px_grad = jacobian(loss_vector, var)
        px_grads.append(px_grad)
    return px_grads

以下是运行fast_per_example_gradient的输出:

  

loss_vector:Tensor(“ Sum_2:0”,shape =(1,),dtype = float32)

     

var:Tensor(“ input_embedding_mat / read:0”,shape =(10007,96),dtype = float32)

     

文件“ .... / optimizer.py”,第132行,在fast_per_example_gradient中       px_grad = jacobian(loss_vector,var)

     

文件   “ /anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/gradients.py”,   第57行,在jacobian中       pfor_outputs = control_flow_ops.pfor(loop_fn,output_size)

     

文件   “ /anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/control_flow_ops.py”,   pfor中的第134行       outputs.append(converter.convert(loop_fn_output))

     

文件   “ /anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/pfor.py”,   1077行,转换       输出= self._convert_helper(y)

     

文件   “ /anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/pfor.py”,   _convert_helper中的第1110行       断言isinstance(y,ops.Tensor),y

     

AssertionError:   IndexedSlices(indices = Tensor(“ loop_body / gradients / concat_1:0”,   shape =(?,),dtype = int32),   values = Tensor(“ loop_body / gradients / concat:0”,shape =(?, 96),   dtype = float32),density_shape = Tensor(“ loop_body / gradients / Shape_1:0”,   shape =(2,),dtype = int32))

0 个答案:

没有答案