我正在尝试在TensorFlow中实现一个简单的XOR门。我的问题是我的功能并不总是收敛。
如果我没错,XOR空间没有局部最小值,所以我不明白为什么会这样。
-
我看到了这个答案:https://stackoverflow.com/a/33750395/2131871,它总是收敛。 我从@mrry的答案中取得了代码,并略微修改了它,因此它没有两个输出节点,只有一个,我使用了tanh激活函数而不是relu& softmax并调整了交叉熵函数。
import math
import tensorflow as tf
import numpy as np
HIDDEN_NODES = 10
x = tf.placeholder(tf.float32, [None, 2])
W_hidden = tf.Variable(tf.truncated_normal([2, HIDDEN_NODES], stddev=1./math.sqrt(2)))
b_hidden = tf.Variable(tf.zeros([HIDDEN_NODES]))
hidden = tf.tanh(tf.matmul(x, W_hidden) + b_hidden)
W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 1], stddev=1./math.sqrt(HIDDEN_NODES)))
b_logits = tf.Variable(tf.zeros([1]))
logits = tf.matmul(hidden, W_logits) + b_logits
y = tf.tanh(logits)
y_input = tf.placeholder(tf.float32, [None, 1])
cross_entropy = tf.abs(tf.sub(y_input, y))
loss = tf.reduce_mean(cross_entropy)
train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
yTrain = np.array([[-1], [1], [1], [-1]])
for d in xrange(20):
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
for i in xrange(500):
_, loss_val = sess.run([train_op, loss], feed_dict={x: xTrain, y_input: yTrain})
if i % 10 == 0:
print "Step:", i, "Current loss:", loss_val
for x_input in [[0, 0], [0, 1], [1, 0], [1, 1]]:
print x_input, sess.run(y, feed_dict={x: [x_input]})
assert loss_val < 0.01
有人能解释我为什么我的解决方案有时无法收敛?感谢。
答案 0 :(得分:3)
您计算错误的方式是让您的网络太容易陷入本地最小值。我怀疑这是因为当从现有解决方案迁移时,xor函数的l1范数具有太多的等权重差解。 (但我不是肯定的 - ML专家可以在这里给你一个更精确的答案。我只是一个系统schmoo。)
简单修复:替换这些行:
cross_entropy = tf.abs(tf.sub(y_input, y))
loss = tf.reduce_mean(cross_entropy)
使用:
loss = tf.nn.l2_loss(y_input - y)