TensorFlow: Langsame Leistung beim Abrufen von Verläufen an Eingängen

Ich baue mit TensorFlow ein einfaches mehrschichtiges Perzeptron und muss auch die Gradienten (oder das Fehlersignal) des Verlusts an den Eingängen des neuronalen Netzwerks ermitteln.

Hier ist mein Code, der funktioniert:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(self.network, self.y))
optimizer = tf.train.AdagradOptimizer(learning_rate=nn_learning_rate).minimize(cost)
...
for i in range(epochs):
    ....
    for batch in batches:
        ...
        sess.run(optimizer, feed_dict=feed_dict)
        grads_wrt_input = sess.run(tf.gradients(cost, self.x), feed_dict=feed_dict)[0]

(bearbeitet, um Trainingsschleife einzuschließen)

Ohne die letzte Zeile grads_wrt_input...), das läuft auf einer CUDA-Maschine sehr schnell. Jedoch,tf.gradients() reduziert die Leistung um das Zehnfache oder mehr.

Ich erinnere mich, dass die Fehlersignale an den Knoten als Zwischenwerte im Backpropagation-Algorithmus berechnet werden, und ich habe dies erfolgreich mit der Java-Bibliothek DeepLearning4j durchgeführt. Ich hatte auch den Eindruck, dass dies eine leichte Modifikation des Berechnungsgraphen sein würde, der bereits von @ erstellt wurdoptimizer.

Wie kann dies schneller gemacht werden, oder gibt es eine andere Möglichkeit, die Gradienten des Verlusts w.r.t zu berechnen? die eingänge?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage