2016-07-05 7 views
8

मेरे पास हानि मूल्य/फ़ंक्शन है और मैं टेंसर f (आकार n) के संबंध में सभी दूसरे डेरिवेटिव की गणना करना चाहता हूं। मैं tf.gradients दो बार का उपयोग करने में कामयाब रहे, लेकिन जब यह दूसरी बार के लिए आवेदन, यह योग पहला इनपुट भर में डेरिवेटिव (second_derivatives मेरी कोड में देखें)।कैसे Tensorflow में सभी दूसरे डेरिवेटिव (हेस्सियन मैट्रिक्स के केवल विकर्ण) की गणना करने के?

इसके अलावा, मैं हेस्सियन मैट्रिक्स पुनः प्राप्त करने में कामयाब रहे, लेकिन मैं केवल अपने विकर्ण गणना करने के लिए अतिरिक्त गणना से बचने के लिए चाहते हैं।

import tensorflow as tf 
import numpy as np 

f = tf.Variable(np.array([[1., 2., 0]]).T) 
loss = tf.reduce_prod(f ** 2 - 3 * f + 1) 

first_derivatives = tf.gradients(loss, f)[0] 

second_derivatives = tf.gradients(first_derivatives, f)[0] 

hessian = [tf.gradients(first_derivatives[i,0], f)[0][:,0] for i in range(3)] 

model = tf.initialize_all_variables() 
with tf.Session() as sess: 
    sess.run(model) 
    print "\nloss\n", sess.run(loss) 
    print "\nloss'\n", sess.run(first_derivatives) 
    print "\nloss''\n", sess.run(second_derivatives) 
    hessian_value = np.array(map(list, sess.run(hessian))) 
    print "\nHessian\n", hessian_value 

मेरे सोच है कि tf.gradients (first_derivatives, च [0, 0]) [0] सम्मान के साथ दूसरा व्युत्पन्न उदाहरण के लिए पुनः प्राप्त करने के f_0 करने के लिए काम होता था, लेकिन यह है कि tensorflow नहीं है लगता है एक टेंसर के टुकड़े से निकलने की अनुमति दें।

उत्तर

6

tf.gradients([f1,f2,f3],...) की f=f1+f2+f3 इसके अलावा, x[0] के संबंध में फर्क समस्याग्रस्त है ढाल की गणना करता है क्योंकि x[0] एक नया Slice नोड जो अपने नुकसान के एक पूर्वज सम्मान के साथ इसलिए व्युत्पन्न नहीं है, के लिए यह None हो जाएगा को दर्शाता है। आपको इसके चारों ओर pack का उपयोग कर x[0], x[1], ...xx में एक साथ गोंद और अपने नुकसान के लिए मिल सकता है xx बजाय x पर निर्भर हैं। एक विकल्प अलग-अलग घटकों के लिए अलग-अलग चर का उपयोग करना है, इस मामले में कंप्यूटिंग हेसियन इस तरह कुछ दिखेंगे।

def replace_none_with_zero(l): 
    return [0 if i==None else i for i in l] 

tf.reset_default_graph() 

x = tf.Variable(1.) 
y = tf.Variable(1.) 
loss = tf.square(x) + tf.square(y) 
grads = tf.gradients([loss], [x, y]) 
hess0 = replace_none_with_zero(tf.gradients([grads[0]], [x, y])) 
hess1 = replace_none_with_zero(tf.gradients([grads[1]], [x, y])) 
hessian = tf.pack([tf.pack(hess0), tf.pack(hess1)]) 
sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
print hessian.eval() 

आप

[[ 2. 0.] 
[ 0. 2.]] 
+0

आपके उत्तर के लिए टैंक, दुर्भाग्य से यह वास्तव में क्योंकि मैं करूंगा मदद नहीं करता है हेसियन के केवल विकर्ण को पुनः प्राप्त करना चाहते हैं। मैंने एक्स [0], एक्स [1] के साथ पैक का उपयोग करने की कोशिश की ... लेकिन यह अभी भी मुझे एक त्रुटि देता है। –

+1

'hess0 = tf.gradients ([grads [0]], [x]); hess1 = tf.gradients ([grads [1]], [y]) 'केवल विकर्ण प्रविष्टियों परिकलित किया जाएगा –

+0

धन्यवाद, मैं अंत में इसे का उपयोग क्या आप पिछले जवाब दिया और tf.pack करने के लिए) में कामयाब (! –

संबंधित मुद्दे