本人刚刚开始接触深度学习不久,对于tensorflow的了解也有限,想通过tensorflow这个框架来学习深度学习及其优化与识别。现在直接进入主题。
1.手写识别的介绍:
MNIST手写识别在机器学习中就像c语言中Hello World一样,MNIST数据集是一个机器视觉的数据集,它由几万张28X28像素点构成的手写数字,我们的任务就是向神经网络输入由这些像素点构成的图片,然后神经网络输出图片对应的标签。
2.用TensorFlow实现手写识别:
(1)首先导入手写数据集MNIST:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
这段代码看不懂没事,它就是TensorFlow内部封装的一个模块,它会自动从网上下载MNIST数据集。
然后查看mnist这个数据集的情况:
print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
print(mnist.validation.images.shape, mnist.validation.labels.shape)
其中mnist.train.images返回训练集的图片信息,minist.test返回测试集的图片信息,mnist.validation.images返回测试集的图片信息。而labels就是图片标签:0-9shape就是矩阵数据的维度,比如 [[2,3],[3,5],[1,5]]通过shape运算就返回(3,2)。
以上运行结果为:
说明了训练集有55000张图片,每张图片由28*28个像素点数据构成。同样测试集有10000张图片构成,验证集由5000个图片构成。我们在训练集上训练数据,在验证集上检验效果并决定何时完成训练,最后在测试机上检验模型的效果。这里我们要注意标签label是一个10维向量,这是一种one_hot格式,标签为0-9之间的数字,如果标签为5,对应label:[0,0,0,0,0,1,0,0,0,0],就是说标签为几就将十位向量的哪一维为位1,其余都置为0.
(2) 接下来载入Tensorflow库 ,并定义x,y两个Placeholder,所谓Placehoder,初学者可以理解为一种容器,后面我们将会把上面的训练集数据mnist.train.images及minst.train.labels输入到x,y中
import tensorflow as tf
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
(3)然后创建一层简单的神经网络:
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,W)+b)
这里的参数x将会是输入的图片数据即为[None,784],None就是图片的数量,因为我们训练的时候并不是一张一张图片输入的,因为一张一张输入的效率低,而且会因为一张噪音图片的对整个网络造成巨大影响,正确的训练方法应该是将100张图片组成的数据集[100,784]输入神经网络进行训练(当然,这里的100也可以是其他数值)。然后得到神经网络的输出prediction,这里的prediction就是标签y的预测值,也是一个10维的向量,例如[0.12,0.22,0.21,0.86,0.33,0.01,0.81,0.15,0.54,0.13]
(4)定义二次损失函数和梯度优化模型,我们的目的就是通过更新神经网络参数W,b来让loss的最小,而更新W,b的操作就是train_step.
#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
(5)计算准确率:
这里的tf.argmax(y,1),tf.argmax(prediction,1)就是计算10维向量y及prediction中元素的最大值,也就是说预测的标签和实际标签相等时tf.equal返回真,否则返回假。最终预测正确的信息被保存到correct_prediction布尔型列表中,在通过tf.cast转化为float型,然后通过tf.reduce_mean求平均求出准确率。
#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
(6)接着就进入正式训练了:
首先通过init初始化变量,接着for循环训练40个回合。batch_size为每个批次的大小,
n_batch为批次数。在每次训练一个回合后计算出测试集的准确率acc,并输出。
# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
for epoch in range(40):
for batch in range(n_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))
以上是程序的运行的结果,可以看到最终准确率为91.94%,这并不是很高的准确率,但却是一个入门的经典例子,后面我们将会讲到如何提高准确率.
全部代码为:
# coding: utf-8
# 载入数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
print(mnist.validation.images.shape, mnist.validation.labels.shape)
import tensorflow as tf
# 定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
# 创建一个简单的神经网络
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x, W) + b)
# 二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))
# 使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
for epoch in range(40):
for batch in range(n_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))
下一篇:tensorflow实战之二:MNIST手写数字识别的优化1