ML(二)——tensorflow实现mnist的识别

一.Tensorflow

TensorFlow是谷歌研发的第二代人工智能学习系统,其命名来源于本身的运行原理——Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。(以上摘自百度百科)

总结一下,就是一个谷歌发布的开源的深度学习框架。

其他深度学习框架诸如微软的CNTK、拥有很多用户的Torch等,大家可以自行了解下,目前深度学习框架个人觉得也就这三种比较好用了。

 

二.softmax

假如这里有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有取到b的可能,这样会造成什么情况?数值小的那个饥饿。所以我希望数值大的那一项经常取到,分值小的那一项也偶尔可以取到,这时softmax就发挥作用了。现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的,所以a会经常取到,而b也会偶尔取到,取到的概率跟它们本来的大小有关。

举个栗子,某个训练集含有三种类别,通过多层计算后,最后得到的某个训练样本的向量的分数是[ 2, 3, 4 ],那么经过softmax函数作用后概率分别就是=[\frac{e^{2} }{e^{2}+e^{3}+e^{4}}\frac{e^{3} }{e^{2}+e^{3}+e^{4}}\frac{e^{4} }{e^{2}+e^{3}+e^{4}}  

] = [0.0903,0.2447,0.665],而这三个值的和是1。

总结一下,softmax输出的就是各个类别的概率值。

 

三.代码实现手写数字集的识别

首先肯定要导入tensorflow模块和读入mnist数据集,tensorflow的安装网上有大把的教程,这里不做说明

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集,如果根目录有就调用,没有就下载
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

接下来创建两个占位符,分别代表输入的图片和图片的标签

x=tf.placeholder(tf.float32,[None,784])
#一个图是28*28个像素格,拉平就是1行28*28列
y=tf.placeholder(tf.float32,[None,10])
#0到9共10个数字,所以10个标签

None表示任意大小,这里表示可以传入任意数量的图片,784和10 的原因代码中注释已经说明

之后定义一下神经网络的权重和偏置值

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

接下来就用到了我们之前说的softmax

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

因为x的形状是(N,784),w的形状是(784,10),所以x*w的形状是(N,10),加上形状是(10,)的b,所以最后的prediction的形状是(N,10)

结合上面说的softmax的含义,这个结果表示每张图片的10种类别中各个的概率值

二次代价函数计算误差值

loss=tf.reduce_mean(tf.square(y-prediction))

梯度下降法减少误差

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

以上训练部分的代码基本完成了,光训练可不行,我们需要知道我们训练的成果,所以我们需要测试准确率

#argmax将最大的数的位置输出,此代码对比预测的与实际的是否一样
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
#tf.cast将布尔型转变成浮点型,true变成1,false变成0
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

接下来我们就可以创建session进行训练了

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(21):
        for batch in range(5000):
            #将图片保存在xs中,图片标签保存在ys中
            batch_xs,batch_ys=mnist.train.next_batch(100)
            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%左右,这是因为:

一、softmax是一个比较简单的模型,

二、二次代价函数存在不足,大家可以换成softmax交叉熵函数来计算loss

三、激励函数:梯度下降法也存在不足

四、大家可以把每次放入的图片数量减少,将放入的批次加大,换一种激励函数等,经过这些操作后,

其实也提高不了多少准确度→。→###

Iter0,Testing Accuracy 0.7323
Iter1,Testing Accuracy 0.8231
Iter2,Testing Accuracy 0.8536
Iter3,Testing Accuracy 0.8678
Iter4,Testing Accuracy 0.8742
Iter5,Testing Accuracy 0.8797
Iter6,Testing Accuracy 0.8824
Iter7,Testing Accuracy 0.8853
Iter8,Testing Accuracy 0.8887
Iter9,Testing Accuracy 0.8918
Iter10,Testing Accuracy 0.8942
Iter11,Testing Accuracy 0.8963
Iter12,Testing Accuracy 0.8972
Iter13,Testing Accuracy 0.8981
Iter14,Testing Accuracy 0.8991
Iter15,Testing Accuracy 0.9002
Iter16,Testing Accuracy 0.9011
Iter17,Testing Accuracy 0.9017
Iter18,Testing Accuracy 0.9031
Iter19,Testing Accuracy 0.904
Iter20,Testing Accuracy 0.9046

 

注:本文原创,转载请注明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值