0

のために収束していない私は、単純なXORニューラルネットワークを書いてみましたが、それは私が2つの入力、2つの隠されたノードと1つの出力とNNを作成TensorflowはXOR

を収束することはありません。

出力を取得するために、最初の隠しレイヤーに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つのホットベクターレイヤーでない限り意味がありません。シグモイドは理にかなっています。 Softmaxの働きを読んで助けてください。

  3. 合計の削減は

  4. hidden2 = tf.matmul(hidden, W2 + b2)が誤ってブラケットを持ってhidden2ないyの上で行われる必要があります。 hidden2 = tf.matmul(hidden, W2) + b2

  5. -Logエラー関数は、0を出力しないようにしようとしている場合にのみ機能します。-log(1)= 0、-log(0)の場合は無限大です。これは出力を1にするが0にはならないようにする。1つの入力に対して0を、別の入力に1をプッシュしようとしているのではなく、1つのホットベクトルに適している。

  6. 2つの隠れ層のニューロンが機能します。しかし、それは初期化においてランダム性に非常に敏感です。余分なニューロン(2の代わりに10)を使用すると、初期化エラーの影響を受けにくくなります。

以下のコードは機能します。これは、異なる入力に対して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}))