TensorFlow XOR代码可以正常使用二维目标,但不是没有?

时间:2015-12-01 01:10:22

标签: neural-network tensorflow

尝试在TensorFlow中实现非常基本的XOR FFNN。我可能只是误解了代码,但任何人都可以看到一个明显的原因,为什么这不起作用 - 爆炸到NaNs并开始损失$ 0 $。 如果你想弄乱它,那么Toggles正在工作/不起作用。 谢谢!

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})

1 个答案:

答案 0 :(得分:3)

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的大小为num_classes的矩阵。每行logits是跨类的未缩放概率分布;并且每行标签是批次中每个示例的真实类的单热编码。如果输入与这些假设不匹配,则培训过程可能会发生分歧。

在此代码中,logits为batch_size乘以1,这意味着只有一个类,softmax为所有示例输出0级预测;标签不是一热的。如果查看implementation of the operatortf.nn.softmax_cross_entropy_with_logits的backprop值为:

// backprop: prob - labels, where
//   prob = exp(logits - max_logits) / sum(exp(logits - max_logits))

每一步都会[[1], [1], [1], [1]] - [[0], [1], [1], [0]],这显然不会收敛。

相关问题