Tensorflow下的Mnist识别

MNIST解析

MNIST是深度学习的经典入门demo,他是由6万张训练图片和1万张测试图片构成的,每张图片都是28*28大小,白底黑字(如下图),而且都是黑白色构成(这里的黑色是一个0-1的浮点数,黑色越深表示数值越靠近1),这些图片是采集的不同的人手写从0到9的数字。TensorFlow将这个数据集和相关操作封装到了库中,下面我们来一步步解读深度学习MNIST的过程。

这里使用了一个28*28=784列的数据来表示一个图片的构成,也就是说,每一个点都是这个图片的一个特征,这个其实比较好理解,因为每一个点都会对图片的样子和表达的含义有影响,只是影响的大小不同而已。至于为什么要将28*28的矩阵摊平成为一个1行784列的一维数组,我猜测可能是因为这样做会更加简单直观。


这个程序参考自极客学院。

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

# MNIST数据存放的路径

file = "./MNIST"

# 导入数据

mnist = input_data.read_data_sets(file, one_hot=True)

# 模型的输入和输出

x = tf.placeholder(tf.float32, shape=[None, 784])

y_ = tf.placeholder(tf.float32, shape=[None, 10])

# 模型的权重和偏移量

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

# 创建Session

sess = tf.InteractiveSession()

# 初始化权重变量

sess.run(tf.global_variables_initializer())

y = tf.nn.softmax(tf.matmul(x, W) + b)

# 交叉熵

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

# 训练

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

for i in range(1000):

    batch = mnist.train.next_batch(50)

    train_step.run(feed_dict={x: batch[0], y_: batch[1]})

# 测试

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))


注释:

# MNIST数据存放的路径

file = "./MNIST"

# 导入数据

mnist = input_data.read_data_sets(file, one_hot=True)


将下载MNIST数据到./MNIST/文件夹下,此过程可能会由于网络问题而出错。建议自己从MNIST官网下载。将下载好的文件放到上述路径下即可。input_data.read_data_sets()函数可以自动检测指定目录下是否存在MNIST数据,如果存在,就不会下载了。

# 模型的输入和输出

x = tf.placeholder(tf.float32, shape=[None, 784])

y_ = tf.placeholder(tf.float32, shape=[None, 10])


这里x和y不是特定的值。它们是表示输入和输出的占位符,可以在进行计算的时候进行赋值。

模型的输入x是一个22维的浮点数张量。它的大小为shape=[None, 784],其中784784是一张展平的MNIST图片的维度。None表示其值不固定。输出y_也是一个22维张量,它的每一行都是一个1010维的one-hot向量,用来表示对应的MNIST图片的类别。

# 模型的权重和偏移量

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))


变量W和b是线性模型的参数,这个线性模型用如下表达式表示:

y_=x∗W+b

y_=x∗W+b

其中,y_y_和xx分别表示上述模型的输入和输出。W是一个784∗10784∗10的矩阵,因为输入有784784个特征,同时有1010个输出值。b是一个1010维的向量,是因为输出有1010个分类。

# 创建Session

sess = tf.InteractiveSession()

# 初始化权重变量

# 以前版本的初始化代码是

# sess.run(tf.initialize_all_variables())

sess.run(tf.global_variables_initializer())


变量需要经过初始化才可以在Session中使用。

# 构建回归模型

y = tf.nn.softmax(tf.matmul(x, W) + b)


把向量化后的图片x和权重矩阵W相乘,加上偏移量b,然后计算每个分类的softmax概率值。

# 交叉熵

cross_entropy = -tf.reduce_sum(y_*tf.log(y))


为训练过程指定损失函数,损失函数是用来评估模型一次预测的好与坏的。在这里使用目标类别和预测类别之间的交叉熵作为我们的损失函数。交叉熵定义如下:

L(y_,y)=−∑iy_ilog(yi)

L(y_,y)=−∑iy_ilog(yi)

其中y_y_表示目标类别,也就是真实值。yy是预测类别,就是模型的输出值。

# 训练

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

for i in range(1000):

    batch = mnist.train.next_batch(50)

    train_step.run(feed_dict={x: batch[0], y_: batch[1]})


这里我们使用TensorFlow内置的梯度下降来进行优化,即让损失函数的值下降,步长为0.010.01。然后通过循环,不断地训练模型。每次循环,都会从训练集中加载5050个样本。

# 测试

# 这里返回一个布尔数组,形如[True, False, True]

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# 将布尔数组转换为浮点数,并取平均值,如上布尔数组可以转换为[1, 0, 1],计算平均值为0.667

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 计算在测试数据上的准确率

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))


模型到这里就构建完成了,但这个模型到底好不好,我们并不知道。所以需要在测试集上验证模型的泛化能力。

参考文章:https://blog.csdn.net/u010858605/article/details/69830657

报错处理:

1.NameError: name 'global_variables_initializer' is not defined

#init_op = tf.initialize_all_variables()

init_op = tf.global_variables_initializer()

2.tensorflow/core/framework/op_kernel.cc:1273] OP_REQUIRES failed at save_restore_v2_ops.cc:109 : Not found: Failed to create a directory: ; No such file or directory

#save_path = saver.save(sess, "model.ckpt")

save_path = saver.save(sess, "./model.ckpt")


tensorflow错误提示:

\src\github\tensorflow\tensorflow\core\framework\op_kernel.cc:1318] OP_REQUIRES failed at whole_file_read_ops.cc:114 : Invalid argument: NewRandomAccessFile failed to Create/Open: D:/dataset/kaggle/cat_or_dog/train/train/cat.2626.jpg

从错误中可以看出:

Invalid argument: NewRandomAccessFile failed to Create/Open: D:/dataset/kaggle/cat_or_dog/train/train/cat.2626.jpg

上面这一句的提示最重要,表示打开文件的路径有问题

解决办法:

1、仔细检查文件的路径是否存在

2、检查路径中是否含有其他的非法字符(中文等)

3、将路径中的"\"替换为"/"

---------------------

MNIST整个库的下载链接为:http://pan.baidu.com/s/1pLcpsk7

有人提取出了 train-images.idx3-ubyte 中的图像,格式为bmp ,一起分享给大家,便于单张测试 链接为  https://pan.baidu.com/s/1c1GXdJi

你可能感兴趣的:(Tensorflow下的Mnist识别)