我正在尝试使用自己的数据运行TensorFlow示例,但是以某种方式分类器始终为每个测试示例选择相同的类。输入数据总是先于随机播放。我有约4000张图像作为训练集,有500张图像作为测试集。
我得到的结果看起来像:
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.]
。分类是二进制的,所以我只有两个标签。
这是我的源代码:
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]))
我错过了一点吗?
您的代码中存在三个潜在的问题:
权重W
初始化为零。来自stats.stackexchange.com的这个问题很好地讨论了为什么这会导致不良的培训结果(例如陷入局部最低水平)。相反,您应该随机初始化它们,例如,如下所示:
W = tf.Variable(tf.truncated_normal([pixels, labels],
stddev=1./math.sqrt(pixels)))
在cross_entropy
将其最小化之前,应将其汇总为单个标量值,例如tf.reduce_mean()
:
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(y_prime, y_))
如果您在小型批次(甚至单个示例)上进行训练,而不是一次对整个数据集进行训练,则可能会得到更快的收敛:
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]})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句