Buduję prosty perceptron wielowarstwowy z TensorFlow, a także muszę uzyskać gradienty (lub sygnał błędu) utraty na wejściach sieci neuronowej.TensorFlow: niska wydajność podczas uzyskiwania gradientów na wejściach
Oto mój kod, który działa:
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]
(edycja zawierać pętlę szkolenia)
bez ostatniej linii (grads_wrt_input...
), to działa bardzo szybko na maszynie CUDA. Jednak tf.gradients()
znacznie zmniejsza wydajność o dziesięciokrotność lub więcej.
Przypominam, że sygnały o błędach w węzłach są obliczane jako wartości pośrednie w algorytmie wstecznej propagacji i pomyślnie to zrobiłem przy użyciu biblioteki Java DeepLearning4j. Miałem również wrażenie, że będzie to niewielka modyfikacja wykresu obliczeniowego, który został już zbudowany przez optimizer
.
Jak można to zrobić szybciej, czy istnieje inny sposób obliczania gradientów straty w.r.t. dane wejściowe?
Dosłownie nazywasz 'tf.gradients()' w pętli treningowej? Jeśli tak, to podejrzewam, że obciążenie wynika z budowania wykresu mapy za każdym razem, gdy go wywołasz? – mrry
Dołączyłem kod pętli treningowej dla jasności; tak nazywam 'tf.gradients()' w pętli treningowej. Program spowalnia stopniowo. Co powinienem zrobić, aby nie dopuścić do powstania tego budynku? –
Wywołuje tf.gradients poza pętlą, aby raz zbudować wykres obliczeniowy dla gradientów. Możesz także ponownie użyć wykresu gradientu utworzonego dla optymalizatora, używając compute_gradients –