详细信息:Ubuntu 14.04(LTS),OpenCV 2.4.13,Spyder 2.3.9(Python 2.7),Tensorflow r0.10
我想识别来自的号码 the image与 Python 和 Tensorflow (可选 OpenCV )。
此外,我想使用具有张量流的MNIST数据训练
像这样(代码被称为this page的视频),
代码:
import tensorflow as tf
import random
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder("float", [None, 784])
y = tf.placeholder("float", [None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
learning_rate = 0.01
training_epochs = 25
batch_size = 100
display_step = 1
### modeling ###
activation = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(activation), reduction_indices=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
### training ###
for epoch in range(training_epochs) :
avg_cost = 0
total_batch = int(mnist.train.num_examples/batch_size)
for i in range(total_batch) :
batch_xs, batch_ys =mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys})
avg_cost += sess.run(cross_entropy, feed_dict = {x: batch_xs, y: batch_ys}) / total_batch
if epoch % display_step == 0 :
print "Epoch : ", "%04d" % (epoch+1), "cost=", "{:.9f}".format(avg_cost)
print "Optimization Finished"
### predict number ###
r = random.randint(0, mnist.test.num_examples - 1)
print "Prediction: ", sess.run(tf.argmax(activation,1), {x: mnist.test.images[r:r+1]})
print "Correct Answer: ", sess.run(tf.argmax(mnist.test.labels[r:r+1], 1))
但是,问题是如何制作像
这样的numpy数组代码添加:
mnist.test.images[r:r+1]
[[0. 0. 0。0. 0. 0 0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0 0. 0 0.50196081 0.50196081 0.50196081 0.50196081 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0 0. 0.50196081 1. 1. 1。 1. 1. 1. 0.50196081 0.25098041 0. 0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0. 0.50196081 1. 1. 1. 1。 1. 1. 1. 1. 1. 1。 0.25098041 0. 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0. 0. 0.74901962 1. 1. 1。 1. 0.50196081 0.50196081 0.50196081 0.74901962 1. 1。 1. 0.74901962 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0. 0.50196081 1. 1. 1。 0.74901962 0. 0-0.0。0。 0.50196081 1. 1. 0.74901962 0. 0。0。 0. 0-0.0.0.0。 0. 0 0. 1. 1. 1。 0.50196081 0. 0. 0. 0. 0。0。 0. 0 0.25098041 1. 1. 0.74901962 0.25098041 0. 0. 0. 0. 0。0。 0. 0 0. 0 0.74901962 1. 1。 0.74901962 0. 0-0.0。0。 0. 0 0. 0 0.25098041 1. 1。 0.74901962 0. 0-0.0。0。 0. 0 0. 0.50196081 1. 1。 0.74901962 0. 0-0.0。0。 0. 0-0.0。0。 0.25098041 1. 1. 0.50196081 0. 0。0。 0. 0 0. 0 0. 0.50196081 1. 1. 0.25098041 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0 1. 1. 0.50196081 0。0。 0. 0 0. 0 0. 0 1。 1. 1. 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0.25098041 1. 1. 1. 0 0。 0. 0 0. 0 0. 0 1。 1. 0.50196081 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0.25098041 1. 1. 1. 1. 0 0。 0. 0-0.0。0。 0.74901962 1. 0.50196081 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0.74901962 1. 1. 1. 0.25098041 0. 0-0.0.0.0。 0. 0.50196081 1. 1. 0. 0 0。 0. 0-0.0。0。 0.25098041 0.74901962 1. 1. 1. 1。 0.74901962 0. 0-0.0。0。 0. 0 0. 0.50196081 1. 1。 0.74901962 0. 0-0.0。 0.25098041 0.50196081 1. 1. 1. 1. 1。 1. 0.50196081 0. 0. 0. 0。0。 0. 0-0.0。0。 0.74901962 1. 1. 1. 1. 0.50196081 0.50196081 0.74901962 1. 1. 1. 1. 1。 1. 1. 0.50196081 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0. 0.74901962 1. 1. 1. 1。 1. 1. 1. 1. 1. 1. 1。 0.50196081 0. 0. 0. 0. 0。0。 0. 0-0.0.0.0。 0. 0 0.25098041 1. 1. 1。 1. 1. 1. 1. 0.50196081 0.25098041 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0。0。 0.50196081 0.50196081 0.50196081 0.50196081 0. 0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0-0.0.0.0。 0. 0 0. 0。]]
当我使用OpenCV解决问题时,我可以制作关于图像的numpy数组,但有点奇怪。 (我想把数组变成28x28的矢量)
代码添加:
image = cv2.imread("img_easy.jpg")
resized_image = cv2.resize(image, (28, 28))
[[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]
[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]
[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]
...,
[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]
[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]
[[255 255 255] [255 255 255] [255 255 255] ...,[255 255 255] [255 255 255] [255 255 255]]]
然后,我将值(' resized_image')放入Tensorflow代码中。 像这样,
代码修改:
### predict number ###
print "Prediction: ", sess.run(tf.argmax(activation,1), {x: resized_image})
print "Correct Answer: 9"
结果,该行发生错误。
ValueError:无法为Tensor u' Placeholder_2:0'提供形状值(28,28,3),其形状为'(?,784)'
最后,
1)我想知道如何制作可以输入tensorflow代码的数据(可能是numpy数组[784])
2)您是否了解使用tensorflow的数字识别示例?
我是机器学习的初学者。
请详细告诉我该怎么做。
答案 0 :(得分:2)
您所使用的图像似乎是RGB,因此是第3维(28,28,3)。
原始MNIST图像为灰度,宽度和高度为28。这就是为什么x占位符的形状为[None,784]的原因,因为28 * 28 =784。
CV2正在以RGB格式读取图像,并且您希望它是灰度的,即(28,28) 进行阅读时,您会发现使用它很有帮助。
image = cv2.imread("img_easy.jpg", cv2.CV_LOAD_IMAGE_GRAYSCALE)
这样做,您的图像应该具有正确的形状(28、28)。
CV2图像值也与问题中显示的MNIST图像不在同一范围内。您可能需要对图像中的值进行归一化,以使其在0-1范围内。
为此,您可能还需要使用CNN(稍微高级一些,但应该会提供更好的结果)。有关更多详细信息,请参见本页https://www.tensorflow.org/tutorials/上的教程。
答案 1 :(得分:1)
您尝试过这个吗?我遇到了同样的问题,这非常有帮助
resized = cv2.resize(image, dsize = (28,28), interpolation = cv2.INTER_CUBIC)