2016-06-27 9 views
2

Ich möchte die Gradienten von Tensor "Y" in Bezug auf Parametermatrix "X" in Tensorflow berechnen. Insbesondere möchte ich die Gradienten nur für eine bestimmte Menge von "Indizes" von "X" berechnen. Der folgende Code berechnet die gesamten Gradienten zuerst, dann kehrt diese Gradienten auf die gewünschten Indizes entsprechen:Mit Tensorflow's "tf.gather" und "tf.gradienten" zusammen

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

Tensorflow des „tf.scatter_sub“ Verwendung, I kann dann die gewünschte Indizes der Parametermatrix „X“ aktualisieren, basierend auf Gradientenabstieg:

das funktioniert einwandfrei, aber am Ende des Tages werden alle Gradienten berechnet! Aus Gründen der Verarbeitungsgeschwindigkeit möchte ich nicht alle Gradienten berechnen. So versuchte ich das:

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) 

In letzterem, "tf.gradient" gibt "keine" Objekte zurück, so kann ich nicht fortfahren. Kann jemand dieses Problem lösen?

Antwort

0

Sie könnten versuchen, X in eine Reihe von kleineren Tensoren aufzuspalten dann

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

dann Steigungen berechnen berechnen w.r.t. jedes der X_i, die dir wichtig sind. Es ist möglicherweise nicht praktisch oder effizient für das, was Sie versuchen zu tun. Ein anderes Ding, das zu berücksichtigen ist, ist, dass abhängig von der Tiefe und der Struktur des Netzwerks ein Gradient für ein einzelnes Element in X von vielen (oder sogar von allen) der Gradienten von den darüber liegenden Schichten abhängen kann. Sie können daher im Vergleich zum Brute-Force-Ansatz nicht viel Rechenzeit einsparen.

1

Damit dies funktioniert, muss Y eine Funktion von sparse_X sein, keine Funktion von X.