TensorFlow XOR 代码适用于二维目标但不是没有?
TensorFlow XOR code works fine with two dimensional target but not without?
尝试在 TensorFlow 中实现一个非常基本的 XOR FFNN。我可能只是误解了代码,但任何人都可以看出这行不通的明显原因——爆炸到 NaN 并从 $0$ 开始。
如果你想弄乱它,切换是有效的/无效的。
谢谢!
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]))
b_hidden = tf.Variable(tf.zeros([HIDDEN_NODES]))
hidden = tf.nn.relu(tf.matmul(x, W_hidden) + b_hidden)
#-----------------
#DOESN"T WORK
W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 1]))
b_logits = tf.Variable(tf.zeros([1]))
logits = tf.add(tf.matmul(hidden, W_logits),b_logits)
#WORKS
# W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 2]))
# b_logits = tf.Variable(tf.zeros([2]))
# logits = tf.add(tf.matmul(hidden, W_logits),b_logits)
#-----------------
y = tf.nn.softmax(logits)
#-----------------
#DOESN"T WORK
y_input = tf.placeholder(tf.float32, [None, 1])
#WORKS
#y_input = tf.placeholder(tf.float32, [None, 2])
#-----------------
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, y_input)
loss = tf.reduce_mean(cross_entropy)
loss = cross_entropy
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
#-----------------
#DOESN"T WORK
yTrain = np.array([[0], [1], [1], [0]])
# WORKS
#yTrain = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
#-----------------
for i in xrange(500):
_, loss_val,logitsval = sess.run([train_op, loss,logits], feed_dict={x: xTrain, y_input: yTrain})
if i % 10 == 0:
print "Step:", i, "Current loss:", loss_val,"logits",logitsval
print sess.run(y,feed_dict={x: xTrain})
TL;DR: 为了使它起作用,你应该使用
loss = tf.nn.l2_loss(logits - y_input)
...而不是 tf.nn.softmax_cross_entropy_with_logits
.
tf.nn.softmax_cross_entropy_with_logits
运算符期望 logits 和标签输入是大小为 batch_size
x num_classes
的矩阵。每行 logits 都是 classes 的未缩放概率分布;并且每一行标签都是批处理中每个示例的真实 class 的单热编码。如果输入与这些假设不匹配,训练过程可能会出现分歧。
在这段代码中,logits是batch_size
乘以1,也就是说只有一个class,softmax输出的预测都是class0例子;标签不是一次性的。如果您查看 implementation of the operator,tf.nn.softmax_cross_entropy_with_logits
的反向传播值是:
// backprop: prob - labels, where
// prob = exp(logits - max_logits) / sum(exp(logits - max_logits))
这样每一步都会[[1], [1], [1], [1]] - [[0], [1], [1], [0]]
,显然不收敛
尝试在 TensorFlow 中实现一个非常基本的 XOR FFNN。我可能只是误解了代码,但任何人都可以看出这行不通的明显原因——爆炸到 NaN 并从 $0$ 开始。 如果你想弄乱它,切换是有效的/无效的。 谢谢!
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]))
b_hidden = tf.Variable(tf.zeros([HIDDEN_NODES]))
hidden = tf.nn.relu(tf.matmul(x, W_hidden) + b_hidden)
#-----------------
#DOESN"T WORK
W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 1]))
b_logits = tf.Variable(tf.zeros([1]))
logits = tf.add(tf.matmul(hidden, W_logits),b_logits)
#WORKS
# W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 2]))
# b_logits = tf.Variable(tf.zeros([2]))
# logits = tf.add(tf.matmul(hidden, W_logits),b_logits)
#-----------------
y = tf.nn.softmax(logits)
#-----------------
#DOESN"T WORK
y_input = tf.placeholder(tf.float32, [None, 1])
#WORKS
#y_input = tf.placeholder(tf.float32, [None, 2])
#-----------------
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, y_input)
loss = tf.reduce_mean(cross_entropy)
loss = cross_entropy
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
#-----------------
#DOESN"T WORK
yTrain = np.array([[0], [1], [1], [0]])
# WORKS
#yTrain = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
#-----------------
for i in xrange(500):
_, loss_val,logitsval = sess.run([train_op, loss,logits], feed_dict={x: xTrain, y_input: yTrain})
if i % 10 == 0:
print "Step:", i, "Current loss:", loss_val,"logits",logitsval
print sess.run(y,feed_dict={x: xTrain})
TL;DR: 为了使它起作用,你应该使用
loss = tf.nn.l2_loss(logits - y_input)
...而不是 tf.nn.softmax_cross_entropy_with_logits
.
tf.nn.softmax_cross_entropy_with_logits
运算符期望 logits 和标签输入是大小为 batch_size
x num_classes
的矩阵。每行 logits 都是 classes 的未缩放概率分布;并且每一行标签都是批处理中每个示例的真实 class 的单热编码。如果输入与这些假设不匹配,训练过程可能会出现分歧。
在这段代码中,logits是batch_size
乘以1,也就是说只有一个class,softmax输出的预测都是class0例子;标签不是一次性的。如果您查看 implementation of the operator,tf.nn.softmax_cross_entropy_with_logits
的反向传播值是:
// backprop: prob - labels, where
// prob = exp(logits - max_logits) / sum(exp(logits - max_logits))
这样每一步都会[[1], [1], [1], [1]] - [[0], [1], [1], [0]]
,显然不收敛