Tf.gradient действует как tfp.math.diag_jacobian

Я пытаюсь вычислить шум для входных данных, используя градиент функции потерь из входных данных:

my_grad = tf.gradients (потеря, ввод)

loss — это массив размером (n x 1), где n — количество наборов данных, m — размер набора данных, вход — массив (n x m), где m — размер одного набора данных.

Мне нужно, чтобы my_grad имел размер (n x m), поэтому для каждого набора данных рассчитывается градиент. Но по определению градиенты, где i!=j равны нулю, но tf.gradients выделяет огромное количество памяти и работает почти всегда...

Версия, которая вычисляет градиенты только там, где i = j, была бы отличной - есть идеи, как туда добраться?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
117
2

Ответы 2

Я полагаю, что нашел решение:

my_grad = tf.gradients (tf.reduce_sum (потеря), ввод)

гарантирует, что перекрестные зависимости i!=j игнорируются - это работает очень хорошо и быстро.

Удивительно, но tf.gradients(loss, input) и tf.gradients(tf.reduce_sum(loss), input) должны давать один и тот же результат и требовать одинаковых вычислительных усилий.

jdehesa 12.03.2019 14:04

Спасибо, что указали на это. Причина, по которой это работает для меня, заключается в следующем: loss =[f(input[i]) for i in range(0, input.shape[0]] Поэтому просто нет производной между loss[i] и input[j], когда я!=j

eLe 13.03.2019 16:43

Это один из возможных подходов:

import tensorflow as tf

x = tf.placeholder(tf.float32, [20, 50])
# Break X into its parts
x_parts = tf.unstack(x)
# Recompose
x = tf.stack(x_parts)
# Compute Y however
y = tf.reduce_sum(x, axis=1)
# Break Y into parts
y_parts = tf.unstack(y)
# Compute gradient part-wise
g_parts = [tf.gradients(y_part, x_part)[0] for x_part, y_part in zip(x_parts, y_parts)]
# Recompose gradient
g = tf.stack(g_parts)
print(g)
# Tensor("stack_1:0", shape=(20, 50), dtype=float32)

Однако у этого есть как минимум две проблемы:

  • Это требует, чтобы вы использовали фиксированный размер для n (но не для m).
  • Это создаст O(n) узлов в графе, что может быть проблемой, если вы намеревались использовать очень большой n.

Теоретически можно использовать цикл while TensorFlow, но что-то в тензорных массивах или циклах не распространяет градиенты по мере необходимости.

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, None])
n = tf.shape(x)[0]
element_shape = x.shape[1:]
x_parts = tf.TensorArray(x.dtype, size=n, dynamic_size=False,
                         element_shape=element_shape, clear_after_read=False)
_, x_parts, _ = tf.while_loop(lambda i, x_parts, x: i < n,
                              lambda i, x_parts, x: (i + 1, x_parts.write(i, x[i]), x),
                              [tf.constant(0, n.dtype), x_parts, x])
x = x_parts.stack()
y = tf.reduce_sum(x, axis=1)
g_parts = tf.TensorArray(y.dtype, size=n, dynamic_size=False,
                         element_shape=element_shape, clear_after_read=True)
_, g_parts, _ = tf.while_loop(lambda i, g_parts, x_parts, y: i < n,
                              lambda i, g_parts, x_parts, y:
                                (i + 1, g_parts.write(i, tf.gradients(y[i], x_parts.read(i))[0]), x_parts, y),
                              [tf.constant(0, n.dtype), g_parts, x_parts, y])
# Fails due to None gradients
g = g_parts.stack()
print(g)

Другие вопросы по теме