पर ग्रेडिएंट प्राप्त करते समय धीमी कार्यक्षमता मैं टेंसरफ्लो के साथ एक साधारण मल्टीलायर परसेप्ट्रॉन का निर्माण कर रहा हूं, और मुझे तंत्रिका नेटवर्क के इनपुट में हानि के ग्रेडियंट (या त्रुटि सिग्नल) को भी प्राप्त करने की आवश्यकता है।टेंसरफ्लो:
यहाँ मेरी कोड है, जो काम करता है:
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]
आखिरी पंक्ति (grads_wrt_input...
) के बिना (प्रशिक्षण पाश शामिल करने के लिए संपादित), यह वास्तव में एक CUDA मशीन पर तेज़ चलता है। हालांकि, tf.gradients()
दस गुना या अधिक से प्रदर्शन को कम कर देता है।
मुझे याद है कि नोड्स पर त्रुटि सिग्नल बैकप्रोपैगेशन एल्गोरिदम में मध्यवर्ती मानों के रूप में गणना की जाती हैं, और मैंने जावा लाइब्रेरी DeepLearning4j का उपयोग करके इसे सफलतापूर्वक किया है। मैं इस धारणा के तहत भी था कि यह पहले से ही optimizer
द्वारा निर्मित गणना ग्राफ में थोड़ा सा संशोधन होगा।
इसे कैसे तेजी से बनाया जा सकता है, या नुकसान के ग्रेडियेंट की गणना करने का कोई और तरीका है w.r.t. इनपुट?
क्या आप सचमुच प्रशिक्षण लूप में 'tf.gradients()' को कॉल कर रहे हैं? यदि ऐसा है तो मुझे संदेह है कि ओवरहेड बैकप्रॉप ग्राफ बनाने से हर बार जब आप इसे कॉल करते हैं? – mrry
मैंने स्पष्टता के लिए प्रशिक्षण लूप कोड शामिल किया है; हाँ मैं प्रशिक्षण लूप में 'tf.gradients()' को बुला रहा हूं। कार्यक्रम धीरे-धीरे धीमा हो जाता है। इस इमारत को ऊपर की ओर रोकने के लिए मुझे क्या करना चाहिए? –
एक बार ग्राडेंट्स के लिए गणना ग्राफ बनाने के लिए लूप के बाहर tf.gradients को कॉल करें। इसके अलावा आप compute_gradients –