我正在尝试Tensorflow 1.10中的新实验功能,该功能是在快速的while循环实现中计算Jacobian。您可以找到代码和演示here。它称为parallel for
或pfor
。
AFIK,此新功能可用于高效地计算每个示例梯度,也就是未聚合的梯度。关于为什么我们可能需要here和here进行了广泛的讨论。
但是当我尝试使用它来计算每个示例的梯度以嵌入查找时,它未能通过某些断言,而且我不知道该如何解决。
下面是有关嵌入定义和使用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))