Tensorflow 总是预测相同的结果 [英] Tensorflow predicts always the same result

查看:50
本文介绍了Tensorflow 总是预测相同的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获取 TensorFlow 示例 使用我自己的数据运行,但不知何故分类器总是为每个测试示例选择相同的类.输入数据总是先打乱.我有大约 4000 张图像作为训练集,500 张图像作为测试集.

I'm trying to get the TensorFlow example running with my own data, but somehow the classifier always picks the same class for every test example. The input data is always shuffled prior. I have about 4000 images as a training set and 500 images as a testing set.

我得到的结果如下:

Result: [[ 1.  0.]] Actually: [ 1.  0.] 
Result: [[ 1.  0.]] Actually: [ 0.  1.] 
Result: [[ 1.  0.]] Actually: [ 1.  0.] 
Result: [[ 1.  0.]] Actually: [ 1.  0.] 
Result: [[ 1.  0.]] Actually: [ 0.  1.] 
Result: [[ 1.  0.]] Actually: [ 0.  1.]
...

右侧保留所有 500 张图像 [1.0.].分类是二元的,所以我只有两个标签.

The right side remains for all 500 images [1. 0.]. The classification is binary so I just have two labels.

这是我的源代码:

import tensorflow as tf
import input_data as id

test_images, test_labels = id.read_images_from_csv(
    "/home/johnny/Desktop/tensorflow-examples/46-model.csv")

train_images = test_images[:4000]
train_labels = test_labels[:4000]
test_images = test_images[4000:]
test_labels = test_labels[4000:]

print len(train_images)
print len(test_images)

pixels = 200 * 200
labels = 2

sess = tf.InteractiveSession()

# Create the model
x = tf.placeholder(tf.float32, [None, pixels])
W = tf.Variable(tf.zeros([pixels, labels]))
b = tf.Variable(tf.zeros([labels]))
y_prime = tf.matmul(x, W) + b
y = tf.nn.softmax(y_prime)

# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, labels])
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_prime, y_)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# Train
tf.initialize_all_variables().run()
for i in range(10):
    res = train_step.run({x: train_images, y_: train_labels})
# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: test_images, y_: test_labels}))

for i in range(0, len(test_images)):
    res = sess.run(y, {x: [test_images[i]]})
    print("Result: " + str(res) + " Actually: " + str(test_labels[i]))

我是不是漏掉了一点?

推荐答案

您的代码中存在三个潜在问题:

There are three potential issues in your code:

  1. 权重 W 被初始化为零.来自 stats.stackexchange.com 的这个问题 很好地讨论了为什么这会导致训练结果不佳(例如陷入局部最小值).相反,您应该随机初始化它们,例如如下:

  1. The weights, W, are initialized to zero. This question from stats.stackexchange.com has a good discussion of why this can lead to poor training outcomes (such as getting stuck in a local minimum). Instead, you should initialize them randomly, for example as follows:

W = tf.Variable(tf.truncated_normal([pixels, labels],
                                    stddev=1./math.sqrt(pixels)))

  • cross_entropy 应在最小化之前聚合为单个标量值,例如使用 tf.reduce_mean():

  • The cross_entropy should be aggregated to a single, scalar value before minimizing it, using for example tf.reduce_mean():

    cross_entropy = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(y_prime, y_))
    

  • 如果您在小批量(甚至单个示例)上进行训练而不是一次在整个数据集上进行训练,您可能会获得更快的收敛速度:

  • You may get faster convergence if you train on mini-batches (or even single examples) rather than training on the entire dataset at once:

    for i in range(10):
            for j in range(4000):
                res = train_step.run({x: train_images[j:j+1],
                                      y_: train_labels[j:j+1]})
    

  • 这篇关于Tensorflow 总是预测相同的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆