使用python和tensorflow

时间:2016-08-19 06:18:20

标签: python opencv ubuntu tensorflow number-recognition

详细信息: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的数字识别示例?

我是机器学习的初学者。

请详细告诉我该怎么做。

2 个答案:

答案 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)