无法在新手教程中使用自定义数据

fail to use custom data in beginner tutorial

我是 Tensorflow 的新手,我学习了有关 MNIST 的初学者教程 (https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html)。 它适用于给定的数据,但当我尝试使用自己的数据时却失败了。 这是一个实现示例,我试图让网络学习加法 (i,j) -> (i+j):

def generateData(n, r=100) :
    inputData = []
    outputData = []
    for k in range(n):
        i, j = random.randrange(0, r), random.randrange(0, r)
        inputData.append([i, j])
        outputData.append([i + j])
    return inputData, outputData

x = tf.placeholder(tf.float32, [None, 2])
W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 1])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(10):
    batch_xs, batch_ys = generateData(10)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
batch_xs, batch_ys = generateData(10)
print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))
feed_dict = {x: batch_xs}
classification = sess.run(y, feed_dict)
print(classification)

因此,我得到 1.0 的准确度和 [1.0] 的分类向量。 100% 的准确度是可能的,因为模型非常简单,但预测显然不是。事实上,如果我用随机数替换生成的输出数据 i+j,我会得到完全相同的结果。在这种情况下,我无法获得 1.0 的准确度。 就好像网络没有学到任何东西一样。 问题出在哪里?

您实际上是在尝试进行线性回归,但您使用的是交叉熵损失,它面向 class化*。尝试使用不同的损失函数,例如squared_loss = tf.reduce_mean(tf.squared_distance(y, y_)).

*此外,您以错误的方式使用了交叉熵损失。如果您想使用交叉熵损失进行 class 化,您的 class 化问题的每个 class 需要一个输出神经元。在上面的代码片段中,您有一个输出神经元(y 的形状为 [None, 1]),但是如果 y 是两个整数的总和,则有 200 个假设的 classes范围从 0 到 100。需要明确的是,这个特定问题应该 不应该 被视为 class 化问题。我只是想指出您提供的代码中的这个错误。