प्रशिक्षण नहीं दे रहा है मैंने Google के TensorFlow लाइब्रेरी के साथ एक एमएलपी बनाया है। नेटवर्क काम कर रहा है लेकिन किसी भी तरह से यह ठीक से सीखने से इंकार कर देता है। यह हमेशा लगभग 1.0 के आउटपुट में परिवर्तित होता है इससे कोई फर्क नहीं पड़ता कि वास्तव में इनपुट क्या है।टेंसरफ्लो एमएलपी एक्सओआर
पूरा कोडhere देखा जा सकता है।
कोई विचार?
इस प्रकार इनपुट और आउटपुट (बैच का आकार 4) है:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]] # XOR input
output_data = [[0.], [1.], [1.], [0.]] # XOR output
n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input")
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output")
छिपा परत विन्यास:
# hidden layer's bias neuron
b_hidden = tf.Variable(0.1, name="hidden_bias")
# hidden layer's weight matrix initialized with a uniform distribution
W_hidden = tf.Variable(tf.random_uniform([2, hidden_nodes], -1.0, 1.0), name="hidden_weights")
# calc hidden layer's activation
hidden = tf.sigmoid(tf.matmul(n_input, W_hidden) + b_hidden)
आउटपुट परत विन्यास:
W_output = tf.Variable(tf.random_uniform([hidden_nodes, 1], -1.0, 1.0), name="output_weights") # output layer's weight matrix
output = tf.sigmoid(tf.matmul(hidden, W_output)) # calc output layer's activation
मेरे तरीकों सीखने इस तरह दिखेगा:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
:
loss = tf.reduce_mean(cross_entropy) # mean the cross_entropy
optimizer = tf.train.GradientDescentOptimizer(0.01) # take a gradient descent for optimizing
train = optimizer.minimize(loss) # let the optimizer train
मैं पार एन्ट्रापी के लिए दोनों सेट अप करने की कोशिश की 10
और
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
जहां n_output
मूल उत्पादन मेरे नेटवर्क द्वारा output_data
और output
भविष्यवाणी/गणना की मूल्य में वर्णित है।
अंदर के लिए लूप (एन अवधियों के लिए) इस प्रकार है प्रशिक्षण:
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
feed_dict={n_input: input_data, n_output: output_data})
मैं loss
, W_hidden
की डिबग printig के लिए cvalues के परिणाम की बचत कर रहा हूँ, ...
कोई फर्क नहीं पड़ता कि मैं क्या कोशिश की है, जब मैं अपने नेटवर्क का परीक्षण, उत्पादन मान्य करने के लिए कोशिश कर रहा है, यह हमेशा कुछ lik का उत्पादन ई इस:
(...)
step: 2000
loss: 0.0137040186673
b_hidden: 1.3272010088
W_hidden: [[ 0.23195425 0.53248233 -0.21644847 -0.54775208 0.52298909]
[ 0.73933059 0.51440752 -0.08397482 -0.62724304 -0.53347367]]
W_output: [[ 1.65939867]
[ 0.78912479]
[ 1.4831928 ]
[ 1.28612828]
[ 1.12486529]]
(--- finished with 2000 epochs ---)
(Test input for validation:)
input: [0.0, 0.0] | output: [[ 0.99339396]]
input: [0.0, 1.0] | output: [[ 0.99289012]]
input: [1.0, 0.0] | output: [[ 0.99346077]]
input: [1.0, 1.0] | output: [[ 0.99261558]]
तो यह नहीं ठीक से सीखने लेकिन हमेशा लगभग 1.0 कोई फर्क नहीं पड़ता जो इनपुट तंग आ गया है करने के लिए converging है।
आपका 'b_hidden' चर एक अदिश है - कि जानबूझकर है? मुझे लगता है कि आपको इसे 'b_hidden = tf.Variable (tf.constant (0.1, shape = [hidden_nodes]), name = "hidden_bias") के रूप में बनाना चाहिए, जो मदद कर सकता है। कोशिश करने की एक और चीज आपकी आउटपुट परत में 'b_output' पूर्वाग्रह शब्द जोड़ना होगा। – mrry
टिप्पणी के लिए धन्यवाद। वास्तव में मैं यह नोटिस करने में असफल रहा कि 'b_hidden' एक वेक्टर भी होना चाहिए, न कि स्केलर ... हालांकि, नेटवर्क अभी भी एक छिपी पूर्वाग्रह के साथ या बिना स्केलर या वेक्टर के रूप में, प्रत्येक इनपुट के लिए लगभग 1.0 तक पहुंच जाता है या आउटपुट परत के लिए पूर्वाग्रह के बिना। मुझे सच में लगता है कि मुझे सीखने की विधि या नेटवर्क आर्किटेक्चर में कुछ गलती याद आ रही है:/ – daniel451