Erstens, nehme ich an Sie die Steigung von Output
in Bezug auf bedeuten die Input
.
Nun the result beider dieser Anrufe:
dO = tf.gradients(Output, Input)
dO_i = tf.gradients(Output[i], Input)
(für jede gültige i
)
wird eine Liste mit einem einzigen Element sein - ein Tensor mit der gleiche Form als Input
, nämlich eine [num_timesteps, features]
Matrix. Auch, wenn Sie alle Matrizen dO_i
(über alle gültigen i
) summieren, ist genau die Matrix dO
.
In diesem Sinne zurück zu Ihrer Frage. In vielen Fällen sind einzelne Zeilen aus der Input
unabhängig, dh Output[i]
wird nur aus Input[i]
berechnet und kennt keine anderen Eingaben (typischer Fall: Batch-Verarbeitung ohne Batchnorm). Wenn das der Fall ist, dann wird dO
Ihnen alle Einzelteile dO_i
auf einmal geben.
Dies liegt daran, jede dO_i
Matrix wie folgt aussehen wird:
[[ 0. 0. 0.]
[ 0. 0. 0.]
...
[ 0. 0. 0.]
[ xxx xxx xxx] <- i-th row
[ 0. 0. 0.]
...
[ 0. 0. 0.]]
Alle Zeilen 0
sein werden, mit Ausnahme der i
-te ein. Also nur durch die Berechnung einer Matrix dO
, können Sie leicht alle dO_i
bekommen. Dies ist sehr effizient.
Wenn dies jedoch nicht Ihr Fall ist und alle Output[i]
von allen Eingaben abhängen, gibt es keine Möglichkeit, einzelne dO_i
nur aus ihrer Summe zu extrahieren. Sie haben keine andere Wahl als jeden Gradient einzeln zu berechnen: Iterieren Sie einfach über i
und führen Sie tf.gradients
aus.