Я пробовал новую экспериментальную функцию в Tensorflow 1.10, которая заключается в вычислении якобиана в быстрой реализации цикла while. Вы можете найти код и демо здесь . Это называется parallel for
или pfor
.
AFIK, Эта новая функция может использоваться для эффективного вычисления градиентов для каждого примера a.k.a неагрегированного градиента. Широко обсуждался вопрос о том, почему нам могут понадобиться эти здесь и здесь .
Но когда я пытался использовать его для вычисления отдельных градиентов для встраивания поиска, он потерпел неудачу в некоторых утверждениях, и я не знаю, как обойти это.
Ниже приведен фрагмент кода для определения встраивания и использования 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
:
вектор потерь: Тензор ("Sum_2: 0", форма = (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, на якобиане
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",
строка 134, в пфоре
outputs.append (converter.convert (loop_fn_output))
Файл
"/Anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/pfor.py",
строка 1077, в конвертировании
output = self._convert_helper (y)
Файл
"/Anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow/python/ops/parallel_for/pfor.py",
строка 1110, в _convert_helper
утвердить isinstance (y, ops.Tensor), y
AssertionError:
IndexedSlices (индексы = Тензорная ( "loop_body / градиенты / concat_1: 0",
shape = (?,), dtype = int32),
значения = Тензор ("loop_body / градиенты / конкат: 0", форма = (?, 96),
dtype = float32), dens_shape = Tensor ("loop_body / градиенты / Shape_1: 0",
shape = (2,), dtype = int32))