在初学者教程中无法使用自定义数据

时间:2016-06-20 04:30:14

标签: tensorflow

我是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的准确度。 就好像网络没有学到任何东西。 问题在哪里?

1 个答案:

答案 0 :(得分:1)

您正在尝试进行线性回归,但您正在使用交叉熵损失,这是针对分类*。尝试使用不同的损失函数,例如squared_loss = tf.reduce_mean(tf.squared_distance(y, y_))

*此外,您正在以错误的方式使用交叉熵损失。如果你想用交叉熵损失进行分类,你需要在每个类别的分类问题上有一个输出神经元。在上面的代码片段中,您有一个输出神经元(y形状为[None, 1]),但如果y是0到0范围内的两个整数之和,则有200个假设类100.为了清楚起见,这个特殊问题应该被视为分类问题。我只是想在你提供的代码中指出这个错误。