एक खिलौना उदाहरण के रूप में मैं 100 नो-शोर डेटा पॉइंट्स से f(x) = 1/x
फ़ंक्शन फिट करने का प्रयास कर रहा हूं। Matlab डिफ़ॉल्ट कार्यान्वयन औसत वर्ग अंतर ~ 10^-10 के साथ असाधारण रूप से सफल है, और पूरी तरह से interpolates।यह टेंसरफ्लो कार्यान्वयन Matlab के एनएन की तुलना में काफी कम सफल क्यों है?
मैं 10 सिग्मोइड न्यूरॉन्स की एक छिपी हुई परत के साथ एक तंत्रिका नेटवर्क को लागू करता हूं। मैं तंत्रिका नेटवर्क पर एक नौसिखिया हूं इसलिए गूंगा कोड के खिलाफ अपने गार्ड पर रहो।
import tensorflow as tf
import numpy as np
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
#Can't make tensorflow consume ordinary lists unless they're parsed to ndarray
def toNd(lst):
lgt = len(lst)
x = np.zeros((1, lgt), dtype='float32')
for i in range(0, lgt):
x[0,i] = lst[i]
return x
xBasic = np.linspace(0.2, 0.8, 101)
xTrain = toNd(xBasic)
yTrain = toNd(map(lambda x: 1/x, xBasic))
x = tf.placeholder("float", [1,None])
hiddenDim = 10
b = bias_variable([hiddenDim,1])
W = weight_variable([hiddenDim, 1])
b2 = bias_variable([1])
W2 = weight_variable([1, hiddenDim])
hidden = tf.nn.sigmoid(tf.matmul(W, x) + b)
y = tf.matmul(W2, hidden) + b2
# Minimize the squared errors.
loss = tf.reduce_mean(tf.square(y - yTrain))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# For initializing the variables.
init = tf.initialize_all_variables()
# Launch the graph
sess = tf.Session()
sess.run(init)
for step in xrange(0, 4001):
train.run({x: xTrain}, sess)
if step % 500 == 0:
print loss.eval({x: xTrain}, sess)
मीन स्क्वायर अंतर ~ 2 * 10^-3 पर समाप्त होता है, इसलिए मैटलैब की तुलना में परिमाण के 7 ऑर्डर खराब होते हैं।
xTest = np.linspace(0.2, 0.8, 1001)
yTest = y.eval({x:toNd(xTest)}, sess)
import matplotlib.pyplot as plt
plt.plot(xTest,yTest.transpose().tolist())
plt.plot(xTest,map(lambda x: 1/x, xTest))
plt.show()
हम फिट देख सकते हैं साथ विज्युअलाइजिंग व्यवस्थित अपूर्ण है: जबकि matlab एक मतभेद समान रूप से < 10^-5 के साथ नग्न आंखों के लिए एकदम सही लग रहा है: मैं के साथ दोहराने की कोशिश की है मैटलैब नेटवर्क का चित्र TensorFlow:
संयोग से, आरेख अवग्रह एक्टिवा के बजाय एक tanh मतलब लगता है टयन समारोह। मुझे यह सुनिश्चित करने के लिए दस्तावेज़ में कहीं भी नहीं मिल रहा है। हालांकि, जब मैं टेंसरफ्लो में एक तनह न्यूरॉन का उपयोग करने का प्रयास करता हूं तो फिटिंग जल्दी से nan
के साथ चर के लिए विफल रहता है। मुझे नहीं पता क्यों।
मैटलैब लेवेनबर्ग-मार्वार्ड प्रशिक्षण एल्गोरिदम का उपयोग करता है। Bayesian नियमितकरण 10^-12 पर औसत वर्गों के साथ और भी सफल है (हम शायद फ्लोट अंकगणित के वाष्प के क्षेत्र में हैं)।
टेंसरफ्लो कार्यान्वयन इतना खराब क्यों है, और मैं इसे बेहतर बनाने के लिए क्या कर सकता हूं?
मैंने अभी तक टेंसर प्रवाह में नहीं देखा है, इसलिए इसके बारे में खेद है, लेकिन आप उस 'toNd' फ़ंक्शन के साथ कुछ विचित्र चीजें कर रहे हैं। 'एनपी।लिंस्पेस पहले से ही एक ndarray लौटाता है, एक सूची नहीं, अगर आप एक सूची को एक एनन्ड्रे में परिवर्तित करना चाहते हैं, तो आपको केवल 'np.array (my_list)' करना है, और यदि आपको अतिरिक्त अक्ष की आवश्यकता है, तो आप कर सकते हैं 'new_array = my_array [np.newaxis,:]'। यह सिर्फ शून्य त्रुटि से कम हो सकता है क्योंकि ऐसा करना है। अधिकांश डेटा में शोर होता है और आप जरूरी नहीं कि शून्य प्रशिक्षण त्रुटि चाहते हैं। 'Reduce_mean' द्वारा निर्णय, यह क्रॉस-सत्यापन का उपयोग कर सकता है। –
@AdamAcosta 'toNd' निश्चित रूप से अनुभव की कमी के लिए एक स्टॉप-गैप है। मैंने पहले 'np.array' की कोशिश की और समस्या यह प्रतीत होती है कि' np.array ([5,7])। आकार' '(2,)' और '(2,1)' नहीं है। 'my_array [np.newaxis,:] 'यह सही करने के लिए प्रतीत होता है, धन्यवाद! मैं अजगर का उपयोग नहीं करता बल्कि एफ # दिन-प्रतिदिन का उपयोग नहीं करता हूं। – Arbil
@AdamAcostaI मुझे नहीं लगता कि 'reduce_mean' क्रॉस-सत्यापन करता है। दस्तावेज़ों से: 'टेंसर के आयामों के तत्वों के माध्य की गणना करता है'। Matlab पार-सत्यापन करता है जो मेरे दिमाग में कोई क्रॉस-सत्यापन की तुलना में प्रशिक्षण नमूना पर फिट को कम करना चाहिए, क्या यह सही है? – Arbil