2016-06-27 2 views
2

Я хочу вычислить градиенты тензора «Y» относительно матрицы параметров «X» в Tensorflow. В частности, я хочу вычислить градиенты только для заданного набора «индексов» «X». Следующий код вычисляет весь градиент, а затем возвращает эти градиенты, соответствующие желаемые показатели:Использование Tensorflow «tf.gather» и «tf.gradients» вместе

Y=some_function_of_X 
grad=tf.gradients(Y,X) 
grads_i_want_to_compute=tf.gather(grad,indices) 

Использования «tf.scatter_sub» Tensorflow, я могу затем обновить желаемые показатели матрицы параметров «X» на основе градиентный:

tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute) 

это работает должным образом, но в конце дня все градиенты вычисляются! Для скорости обработки я не хочу вычислять все градиенты. Поэтому я пробовал это:

Y=some_function_of_X 
sparse_X=tf.gather(X,indices) 
grads_i_want_to_compute = tf.gradient(Y,sparse_X) 
tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute) 

В последнем случае «tf.gradient» возвращает объекты «Нет», поэтому я не могу продолжить. Кто-нибудь знает, как решить эту проблему?

ответ

0

Вы могли бы попытаться разбить X на множество меньших тензоров затем вычислить

Y = F (tf.concat (list_of_X_i, ...))

затем вычисляют градиенты w.r.t. каждый из X_i, о котором вы заботитесь. Это может быть непрактично или эффективно для того, что вы пытаетесь сделать.

Другое дело, что в зависимости от глубины и структуры сети градиент для одного элемента в X может зависеть от многих (или даже всех) градиентов от вышеперечисленных слоев. Таким образом, вы не можете экономить много вычислений по сравнению с подходом грубой силы.

1

Для выполнения этой работы вам необходимо, чтобы функция Y была функцией sparse_X, а не функцией X.