TF Gradient Tape имеет проблемы с перекрестными продуктами? - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь использовать градиентную ленту TF как инструмент автограда для root поиска по методу Ньютона. Но когда я пытаюсь вычислить матрицу Якоби, кажется, что tf.GradientTape.jacobian не может обрабатывать перекрестные продукты:

x = tf.convert_to_tensor(np.array([1., 2., 3.]))
Wx = np.ones((3))
with tf.GradientTape() as tape:
    tape.watch(x)
    y = tf.linalg.cross(x, Wx)
print(tape.jacobian(y, x))

выдает ошибку ниже:

StagingError : в преобразованном коде: относительно /Users/xinzhang/anaconda3/lib/python3.7/site-packages:

tensorflow_core/python/ops/parallel_for/control_flow_ops.py:184 f  *
    return _pfor_impl(loop_fn, iters, parallel_iterations=parallel_iterations)
tensorflow_core/python/ops/parallel_for/control_flow_ops.py:257 _pfor_impl
    outputs.append(converter.convert(loop_fn_output))
tensorflow_core/python/ops/parallel_for/pfor.py:1231 convert
    output = self._convert_helper(y)
tensorflow_core/python/ops/parallel_for/pfor.py:1395 _convert_helper
    if flags.FLAGS.op_conversion_fallback_to_while_loop:
tensorflow_core/python/platform/flags.py:84 __getattr__
    wrapped(_sys.argv)
absl/flags/_flagvalues.py:633 __call__
    name, value, suggestions=suggestions)

UnrecognizedFlagError: Unknown command line flag 'f'

Принимая во внимание, что если я переключу вызов Jacobian на простой градиент:

x = tf.convert_to_tensor(np.array([1., 2., 3.]))
Wx = np.ones((3))
with tf.GradientTape() as tape:
    tape.watch(x)
    y = tf.linalg.cross(x, Wx)
print(tape.gradient(y, x))

дает ожидаемый результат:

tf.Tensor([0. 0. 0.], shape=(3,), dtype=float64)

Это ошибка ?? Или я что-то не так делаю с методом tape.jacobian?

ps python версия 3.7.4; tf версия 2.0.0 Все установлено с conda.

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