TensorFlow简单的XOR例如不收敛
问题描述:
我有下面的代码来学习简单的XOR网络:TensorFlow简单的XOR例如不收敛
import tensorflow as tf
import numpy as np
def generate_xor(length=1000):
x = np.random.randint(0,2, size=(length,2))
y = []
for pair in x:
y.append(int(np.logical_xor(pair[0],pair[1])))
return x, np.array(y)
n_inputs = 2
n_hidden = n_inputs*4
n_outputs = 1
x = tf.placeholder(tf.float32, shape=[1,n_inputs])
y = tf.placeholder(tf.float32, [1, n_outputs])
W = tf.Variable(tf.random_uniform([n_inputs, n_hidden],-1,1))
b = tf.Variable(tf.zeros([n_hidden]))
W2 = tf.Variable(tf.random_uniform([n_hidden,n_outputs],-1,1))
b2 = tf.Variable(tf.zeros([n_outputs]))
def xor_model(data):
x = data
hidden_layer = tf.nn.relu(tf.matmul(x,W)+b)
output = tf.nn.relu(tf.matmul(hidden_layer, W2)+b2)
return output
xor_nn = xor_model(x)
cost = tf.reduce_mean(tf.abs(xor_nn - y))
train_step = tf.train.AdagradOptimizer(0.05).minimize(cost)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
x_data,y_data = generate_xor(length=100000)
errors = []
count = 0
out_freq = 1000
for xor_in, xor_out in zip(x_data,y_data):
_, err = sess.run([train_step, cost], feed_dict={x:xor_in.reshape(1,2), y:xor_out.reshape(1,n_outputs)})
errors.append(err)
count += 1
if count == out_freq:
tol = np.mean(errors[-out_freq:])
print tol
count = 0
if tol < 0.005:
break
n_tests = 100
correct = 0
count = 0
x_test, y_test = generate_xor(length=n_tests)
for xor_in, xor_out in zip(x_test, y_test):
output = sess.run([xor_nn], feed_dict={x:xor_in.reshape(1,2)})[0]
guess = int(output[0][0])
truth = int(xor_out)
if guess == truth:
correct += 1
count += 1
print "Model %d : Truth %d - Pass Rate %.2f" % (int(guess), int(xor_out), float(correct*100.0)/float(count))
但是,我不能可靠地收敛的代码。我尝试改变隐藏层的大小,使用不同的优化器/步长和不同的权重和偏差初始化。
我很明显正在做一个元素错误。如果有人能帮助我会很感激。
编辑:
感谢炳廷和亚历山大Svetkin我设法发现我的错误。首先,当我把它们输入整数时,我没有把输出四舍五入,这是一个男生的错误。其次,我有一个relu在输出层,这是不需要的 - 复制和粘贴错误。第三,relu确实是这项任务的激活函数的一个错误选择,使用sigmoid函数效果更好。
所以这个:
hidden_layer = tf.nn.relu(tf.matmul(x,W)+b)
output = tf.nn.relu(tf.matmul(hidden_layer, W2)+b2)
变成这样:
hidden_layer = tf.nn.sigmoid(tf.matmul(x,W)+b)
output = tf.matmul(hidden_layer, W2)+b2
这:
guess = int(output[0][0])
变成这样:
guess = int(output[0][0]+0.5)
答
不应该只返回输出层的激活功能而不是relu
?
output = tf.matmul(hidden_layer, W2) + b2
答
- RELU只是不是二元分类任务右激活功能,使用不同的东西,像双曲线函数。
- 注意你的浮点输出值。 0.99应该是1还是0?使用舍入。