[机器学习]Tensorflow实践:CNN程序测试mnist数据集

MNIST机器学习入门

参考:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片,它也包含每一张图片对应的标签,告诉我们这个是数字几。

一、Softmax Regression

从一个很简单的数学模型开始--Softmax Regression--介绍下如何使用TensorFlow

softmax模型:可以用来给不同的对象分配概率

softmax回归模型


向量表示法

解释:

1.得到一张给定图片属于某个特定数字类的证据(evidence):

如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数

对于给定的输入图片x它代表的是数字i的证据可以表示为:

图片像素值进行加权求和

其中W 代表权重,bi代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引用于像素求和。

2.用softmax函数可以把这些证据转换成概率 y:

softmax函数

实现回归模型:

为了用python实现高效的数值计算,我们通常会使用函数库,比如NumPy,会把类似矩阵乘法这样的复杂运算使用其他外部语言实现。but,从外部计算切换回Python的每一个操作,仍然是一个很大的开销。so,TensorFlow也把复杂的计算放在python之外完成,但Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。

这就是为什么tensorflow使用session来运行会话?

因为python会使用一些非python实现的库比如numpy,如果每个操作和数据都做内外交换代价太大,所以把所有操作描述为图,把整个操作图打包放入session,作为一个整体做内外交换,这样就能避免频繁的内外交换带来的性能损失。

#coding=utf-8  中文注释

import tensorflow as tf 

 #使用tensorflow之前,先导入它

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

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

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

“““x不是一个特定的值,而是一个占位符placeholder,我们在TensorFlow运行计算时输入这个值。我们希望能够输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图,这个张量的形状是[None,784 ]。(这里的None表示此张量的第一个维度可以是任何长度的。) ”””

“““赋予tf.Variable不同的初值来创建不同的Variable:在这里,我们都用全为0的张量来初始化W和b。因为我们要学习W和b的值,它们的初值可以随意设置。”””

“““W的维度是[784,10],因为我们想要用784维的图片向量乘以它以得到一个10维的证据值向量,每一位对应不同数字类。b的形状是[10],所以我们可以直接把它加到输出上面”””

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

#实现模型

“““ 矩阵相乘:tf.matmul(​​X,W)表示x乘以W”””

y_ = tf.placeholder("float", [None,10])

“““ 因为要计算交叉熵,所以又有计算公式,所以又要定义输入变量-占位符”””

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

“““计算交叉熵:首先,用 tf.log 计算 y 的每个元素的对数。接下来,我们把 y_ 的每一个元素和 tf.log(y) 的对应元素相乘。最后,用 tf.reduce_sum 计算张量的所有元素的总和。(注意,这里的交叉熵不仅仅用来衡量单一的一对预测和真实值,而是所有100幅图片的交叉熵的总和。对于100个数据点的预测表现比单一数据点的表现能更好地描述我们的模型的性能。 ”””

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

“““在这里要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。TensorFlow也提供了其他许多优化算法 。TensorFlow在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少成本。”””

init = tf.initialize_all_variables()

sess = tf.Session()

sess.run(init)

#在运行计算之前,我们需要添加一个操作来初始化我们创建的变量variables在声明时赋值了吗?

#之前不是对variables初始化为0了吗?这一步有用吗?

“““对variables的任何操作一定要用Session。”””

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})

“““ 该循环的每个步骤中,都会随机抓取训练数据中的100个批处理数据点,然后用这些数据点作为参数替换之前的占位符来运行train_step”””

“““和前面的搭模型的代码不同,这里出现了run(),一旦tf开始run就说明有flow流过,此时variables全部有值了。而mnist.train.next_batch的参数是batchsize。返回值是下一批输入值和标签值。mnist自身带有函数next_batch,返回值就是下一批的数据与标签。”””

“““使用一小部分的随机数据来进行训练被称为随机训练(stochastic training)- 在这里更确切的说是随机梯度下降训练。在理想情况下,我们希望用我们所有的数据来进行每一步的训练,因为这能给我们更好的训练结果,但显然这需要很大的计算开销。所以,每一次训练我们可以使用不同的数据子集,这样做既可以减少计算开销,又可以最大化地学习到数据集的总体特性。”””

对于sess.run()函数的具体讲解还没找到好的内容

#评估模型

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

“““tf.argmax是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而tf.argmax(y_,1)代表正确的标签,我们可以用tf.equal来检测我们的预测是否真实标签匹配(索引位置一样表示匹配) ”””

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

“““这行代码会给我们一组布尔值。为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值。例如,[True, False, True, True]会变成[1,0,1,1],取平均值后得到0.75. ”””

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

#计算所学习到的模型在测试数据集上面的正确率

“““ ”””

准确率     ??

自总结步骤:

0.明确数学模型公式

Tensorflow编程

1.描述计算图(即定义计算模型公式)

1.1定义计算模型中所需变量--模型公式中的输入placeholder+模型参数Variable

(Variable:主要是用于训练参数之类的变量。比如我们经常使用的网络权重,偏置。Variable在声明是必须赋予初始值。在训练过程中该值很可能会进行不断的加减操作变化。

placeholder:也是用于存储数据,但是主要用于feed_dict的配合,接收输入数据用于训练模型等。placeholder值在训练过程中会不断地被赋予新的值,用于批训练,基本上其值是不会轻易进行加减操作。placeholder在命名时是不需要赋初值,其被赋予值得时间实际在feed_dict时。

参考:http://baijiahao.baidu.com/s?id=1577414740643614734&wfr=spider&for=pc)

1.2实现模型--即定义出完整的计算公式

2.训练模型准备

2.1定义评估模型好坏的指标--损失函数

常见的cost 函数--“交叉熵”

交叉熵函数

其中y 是我们预测的概率分布, y' 是实际的分布

PS:一旦出现要使用的公式模型,就要利用【1描述计算图】中的实现流程将其实现

所以,定义交叉熵公式中需要的变量+实现整个计算公式

2.2选择优化算法

因为TensorFlow拥有一张描述你各个计算单元的图,它可以自动地使用反向传播算法(backpropagation algorithm)来有效地确定你的变量是如何影响你想要最小化的那个成本值的。然后,TensorFlow会用你选择的优化算法来不断地修改变量以降低成本。

常见:梯度下降算法

2.3初始化所有参数

init = tf.initialize_all_variables()

#启动模型

sess = tf.Session()

sess.run(init)   ???

3.训练模型

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})

4.评估模型

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})

参考:http://www.cnblogs.com/manziluo/p/5789692.html


二、CNN卷积神经网络

什么是CNN?

图像识别领域主要使用CNN

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容