Tensorflow быстрое вычисление Якобиана с использованием pfor не удалось встроить поиск - PullRequest
0 голосов
/ 02 ноября 2018

Я пробовал новую экспериментальную функцию в 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))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...