0

我試着寫一個簡單的XOR的神經網絡,但它從來沒有收斂Tensorflow不收斂的XOR

我創建了一個與NN 2個輸入,2個隱藏節點和1個輸出。

我在第一個隱藏層上使用了relu,最後使用了softmax來獲得輸出。

理論上它應該學會如何解決它並收斂?因爲他們沒有使用RELU

import tensorflow as tf 

sess = tf.InteractiveSession() 

# define placeholder for input and output 
x_ = tf.placeholder(tf.float32, shape=[4,2], name="x-input") 
y_ = tf.placeholder(tf.float32, shape=[4,1], name="y-input") 

# Configure weights and layers 
W = tf.Variable(tf.random_uniform([2, 2], -.01, .01)) 
b = tf.Variable(tf.random_uniform([2], -.01, .01)) 
hidden = tf.nn.relu(tf.matmul(x_,W) + b) # first layer. 

W2 = tf.Variable(tf.random_uniform([2,1], -.1, .1)) 
b2 = tf.Variable(tf.zeros([1])) 
hidden2 = tf.matmul(hidden, W2 + b2) 
y = tf.nn.softmax(hidden2) 

# Training function 
cross_entropy = -tf.reduce_sum(y_*tf.log(hidden2)) 
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(cross_entropy) 

XOR_X = [[0,0],[0,1],[1,0],[1,1]] 
XOR_Y = [[0],[1],[1],[0]] 

init = tf.global_variables_initializer() 
sess.run(init) 
# Train on the input data 
for i in range(100): 
    sess.run([cross_entropy, train_step], feed_dict={x_: XOR_X, y_: XOR_Y}) 
    print ('W1', sess.run(W)) 
    print('Output ', sess.run(y, feed_dict={x_: XOR_X, y_: XOR_Y})) 

回答

0

的錯誤......

  1. 的W2的權重應爲-1到1之間。此外,第一層權重使用ReLu,所以我將它們設置爲正面以嘗試避免死神經元。

  2. Softmax是沒有意義的,除非它是1個熱矢量層。 Sigmoid更有意義。閱讀Softmax如何幫助工作。

  3. 減少和應Y上做不hidden2

  4. hidden2 = tf.matmul(hidden, W2 + b2)有括號不正確。應該是hidden2 = tf.matmul(hidden, W2) + b2

  5. -Log作爲錯誤函數只適用於如果您試圖使輸出爲1而不是0的情況。這是因爲-log(1)= 0,當-log(0)時是無窮大。這會鼓勵輸出變爲1,但不是0.對於1個熱矢量來說,如果您試圖將輸出推送到0,而對另一個輸入則推送1,則不會。

  6. 隱藏層中的2個神經元確實有效。但它在初始化時非常容易受到隨機性的影響。使用額外的神經元(10而不是2)使得這不易受初始化錯誤的影響。

下面的代碼工作。它使用了一個成本函數,可以幫助收斂到0和1,用於不同的輸入。

import tensorflow as tf 
sess = tf.InteractiveSession() 

# define placeholder for input, None as first argument means tensor can be any length 
x_ = tf.placeholder(tf.float32, shape=[4,2], name="x-input") 
y_ = tf.placeholder(tf.float32, shape=[4,1], name="y-input") 

# Configure weights and layers 
W = tf.Variable(tf.random_uniform([2, 10], 0.001, .01)) 
b = tf.Variable(tf.zeros([10])) 
hidden = tf.nn.relu(tf.matmul(x_,W) + b) # first layer. 

W2 = tf.Variable(tf.random_uniform([10,1], -1, 1)) 
b2 = tf.Variable(tf.zeros([1])) 
hidden2 = tf.matmul(hidden, W2) + b2 
y = tf.nn.sigmoid(hidden2) 

# Training function + data 
cost = tf.reduce_mean(((y_ * tf.log(y)) + 
((1 - y_) * tf.log(1.0 - y))) * -1) 
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost) 

XOR_X = [[0,0],[0,1],[1,0],[1,1]] 
XOR_Y = [[0],[1],[1],[0]] 

init = tf.global_variables_initializer() 
sess.run(init) 
# Train on the input data 
for i in range(100000): 
    sess.run(train_step, feed_dict={x_: XOR_X, y_: XOR_Y}) 
    if i % 2000 == 0: 
     print ('W1', sess.run(W)) 
     print('Output ', sess.run(y, feed_dict={x_: XOR_X, y_: XOR_Y}))