使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993
1. 下载MNIST数据集
当我们开始学习编程的时候,第一件事往往是学习打印”Hello World”。就好比编程入门有Hello World,机器学习入门有MNIST。
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
每张图片大小为28*28,展开成一维行向量就是784维,即每张图片就是784维空间中的一个点。
tensorflow提供一个input_data.py文件,专门用于下载mnist数据,我们直接调用就可以了,代码如下:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
- 1
- 2
执行完成后,会在当前目录下新建一个文件夹MNIST_data, 下载的数据将放入这个文件夹内。下载的四个文件为:
每个子集都由两部分组成:图片部分(images)和标签部分(labels), 我们可以用下面的代码来查看 :
print(mnist.train.images.shape)
print(mnist.train.labels.shape)
print(mnist.validation.images.shape)
print(mnist.validation.labels.shape)
print(mnist.test.images.shape)
print(mnist.test.labels.shape)
- 1
- 2
- 3
- 4
- 5
- 6
以上代码第一行会输出结果(55000, 784),表明训练集为一个55000行,784列的数组,55000即是训练集图片的总数,784即是每一张二维图片展开成一维所得值。
2. 神经网络
神经网络没有卷积功能,只有简单的三层:输入层,隐藏层和输出层。
数据从输入层输入,在隐藏层进行加权变换,最后在输出层进行输出。输出的时候,使用softmax回归,输出属于每个类别的概率值:
如果把它写成一个等式,我们可以得到:
我们也可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。
其中,x1,x2,x3为输入数据,经过运算后,得到三个数据属于某个类别的概率值y1,y2,y3. 更进一步,可以写成更加紧凑的方式:
在训练过程中,我们将真实的结果和预测的结果相比(交叉熵比较法),会得到一个残差。公式如下:
y 是我们预测的概率值, y’ 是实际的值。这个残差越小越好,使用梯度下降法,不停地改变W和b的值,使得残差逐渐变小,最后收敛到最小值。这样训练就完成了,就得到了一个模型(W和b的最优化值)。
3. 完整代码
完整代码如下:
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
#下载并加载数据
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
#数据与标签的占位
x = tf.placeholder(tf.float32,shape = [None,784])
y_actual = tf.placeholder(tf.float32,shape=[None,10])
#初始化权重和偏置
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#softmax回归,得到预测概率
y_predict = tf.nn.softmax(tf.matmul(x,W) + b)
#求交叉熵得到残差
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_actual*tf.log(y_predict),reduction_indices=1))
#梯度下降法使得残差最小
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#测试阶段,测试准确度计算
correct_prediction = tf.equal(tf.argmax(y_predict,1),tf.argmax(y_actual,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,'float'))#多个批次的准确度均值
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
#训练,迭代1000次
for i in range(1000):
batch_xs,batch_ys = mnist.train.next_batch(100)#按批次训练,每批100行数据
sess.run(train_step,feed_dict={x:batch_xs,y_actual:batch_ys})#执行训练
if(i%100==0):#每训练100次,测试一次
print("accuracy:",sess.run(accuracy,feed_dict={x: mnist.test.images, y_actual: mnist.test.labels}))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
运行结果如下:
参考:
1.http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html
2.http://www.cnblogs.com/denny402/p/5852983.html
上一篇: Oracle基础操作