tensorflow学习笔记之MNIST入门

翻译来自http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html,我只挑选了一些我认为比较重要的做了摘抄并加上了自己的理解,若需要完整的教学,直接看这个网站就好了。
1、MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
这里写图片描述
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
2、建议在读这篇教程的时候先去上网学习一下神经网络相关知识,还有前向后向传播算法,BP算法什么的,会对理解有很大的帮助。
3、如果已经对神经网络有一定了解,就会知道教程中一大部分都是讲的一个简单的机器学习过程。总体的过程就是
1)为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。红色负数权值,蓝色正数权值。
这里写图片描述
2)这里写图片描述
对输入的图片的像素数据做一个加权求和,w是权值矩阵,因为有干扰因素,所以加上了偏置b。
3)对以上得到的evidence用激活函数进行激活。这里的激活函数是softmax函数。这个函数在Andrew Ng的Cs229的第4个lecture中有讲。大概就是用来把输入归入1..k这些类别中。然后计算参数也就是计算某个输入是第i类的方法就是
这里写图片描述
模型基本上就是这样了。
4)然后就可以开始训练了,训练的时候由于我们是来优化模型,要定义一个指标才能知道模型好不好,这里用交叉熵成本函数来评判(如果不是想搞太多研究的话,可以不去细究这个函数)
这里写图片描述
y 是我们预测的概率分布, y’ 是实际的分布(我们输入的one-hot vector)。比较粗糙的理解是,交叉熵是用来衡量我们的预测用于描述真相的低效性。通常情况下我们在未归一化的数据上用tf.nn.softmax_cross_entropy_with_logits (e.g., 我们在tf.matmul(x, W) + b上调用softmax_cross_entropy_with_logits)
5)知道模型,知道成本函数了以后,用梯度下降算法来优化参数,降低成本函数。
6)上面一直都是在用训练数据集来优化参数,优化完成后,还要用测试数据集来看一下正确率是多少。
总体的训练差不多就是这样
下面就是tf编码过程了。
4、要先从http://yann.lecun.com/exdb/mnist/网站下载四组数据,然后把数据放在文件所在文件夹里才能正常导入数据。而对于placeholder等,若不明白,可以参考http://blog.csdn.net/Ema1997/article/details/72801479我之前写的博客,或者直接去官网查看

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

__author__ = 'Google and Emma Guo'

import tensorflow as tf
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

#调入数据
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('.',one_hot=True)

#建立一个placeholder一会用来存储输入数据
x = tf.placeholder(tf.float32, [None, 784])

#W是权值矩阵,b是偏置量向量
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

#y是模型预测出的概率分布,y_是实际的概率分布,cross_entropy是成本函数交叉熵
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))

#用下面这步函数训练参数,使得成本函数逐渐减小,梯度下降的步长是0.01
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

#对所有变量初始化,很重要
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

#按上面的模型训练1000次
for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

#tf.argmax 是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
#为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
#最后,我们计算所学习到的模型在测试数据集上面的正确率。
print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值