Tensorflow 不收敛 XOR
Tensorflow doesn't converge for XOR
我尝试编写一个简单的 XOR 神经网络,但它从未收敛
我创建了一个具有 2 个输入、2 个隐藏节点和 1 个输出的神经网络。
我在第一个隐藏层上使用 relu,在最后使用 softmax 来获得输出。
理论上应该学会如何求解并收敛?
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}))
错误...
W2 权重应该在 -1 和 1 之间,因为它们没有使用 ReLu。第一层权重也使用 ReLu,所以我将它们设置为正值以避免死神经元。
Softmax 没有任何意义,除非它是 1 个热向量层。 Sigmoid 更有意义。阅读 Softmax 的工作原理会有所帮助。
应在未隐藏的 y 上减少总和2
hidden2 = tf.matmul(hidden, W2 + b2)
有错误的括号。应该是hidden2 = tf.matmul(hidden, W2) + b2
-Log 作为错误函数仅在您尝试使输出为 1 而不是 0 时才有效。这是因为 -log(1) = 0,而当 -log(0) ).这会鼓励输出变为 1 而不是 0。如果您试图将一个输入的输出推至 0 而另一个输入推至 1,则对 1 个热向量不适用。
隐藏层中的 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}))
我尝试编写一个简单的 XOR 神经网络,但它从未收敛
我创建了一个具有 2 个输入、2 个隐藏节点和 1 个输出的神经网络。
我在第一个隐藏层上使用 relu,在最后使用 softmax 来获得输出。
理论上应该学会如何求解并收敛?
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}))
错误...
W2 权重应该在 -1 和 1 之间,因为它们没有使用 ReLu。第一层权重也使用 ReLu,所以我将它们设置为正值以避免死神经元。
Softmax 没有任何意义,除非它是 1 个热向量层。 Sigmoid 更有意义。阅读 Softmax 的工作原理会有所帮助。
应在未隐藏的 y 上减少总和2
hidden2 = tf.matmul(hidden, W2 + b2)
有错误的括号。应该是hidden2 = tf.matmul(hidden, W2) + b2
-Log 作为错误函数仅在您尝试使输出为 1 而不是 0 时才有效。这是因为 -log(1) = 0,而当 -log(0) ).这会鼓励输出变为 1 而不是 0。如果您试图将一个输入的输出推至 0 而另一个输入推至 1,则对 1 个热向量不适用。
隐藏层中的 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}))