Ternsorflow 学习:004-MNIST 构建模型

Softmax回归介绍

我们知道MNIST的每一张图片都表示一个数字,从0到9。我们希望得到给定图片代表每个数字的概率。比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值。

这是一个使用softmax回归(softmax regression)模型的经典案例。softmax模型可以用来给不同的对象分配概率。即使在之后,我们训练更加精细的模型时,最后一步也需要用softmax来分配概率。

softmax回归(softmax regression)分两步:第一步

为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。

下面的图片显示了一个模型学习到的图片上每个像素对于特定数字类的权值。红色代表负数权值,蓝色代表正数权值。

我们也需要加入一个额外的偏置量(bias),因为输入往往会带有一些无关的干扰量。因此对于给定的输入图片 x 它代表的是数字 i 的证据可以表示为

其中 代表权重, 代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引用于像素求和。然后用softmax函数可以把这些证据转换成概率 y

这里的softmax可以看成是一个激励(activation)函数或者链接(link)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。softmax函数可以定义为:

展开等式右边的子式,可以得到:

但是更多的时候把softmax模型函数定义为前一种形式:把输入值当成幂指数求值,再正则化这些结果值。这个幂运算表示,更大的证据对应更大的假设模型(hypothesis)里面的乘数权重值。反之,拥有更少的证据意味着在假设模型里面拥有更小的乘数系数。假设模型里的权值不可以是0值或者负值。Softmax然后会正则化这些权重值,使它们的总和等于1,以此构造一个有效的概率分布。(更多的关于Softmax函数的信息,可以参考Michael Nieslen的书里面的这个部分,其中有关于softmax的可交互式的可视化解释。)

对于softmax回归模型可以用下面的图解释,对于输入的xs加权求和,再分别加上一个偏置量,最后再输入到softmax函数中:

如果把它写成一个等式,我们可以得到:

我们也可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。(也是一种更有效的思考方式)

更进一步,可以写成更加紧凑的方式:

实现回归模型

为了用python实现高效的数值计算,我们通常会使用函数库,比如NumPy,会把类似矩阵乘法这样的复杂运算使用其他外部语言实现。不幸的是,从外部计算切换回Python的每一个操作,仍然是一个很大的开销。如果你用GPU来进行外部计算,这样的开销会更大。用分布式的计算方式,也会花费更多的资源用来传输数据。

TensorFlow也把复杂的计算放在python之外完成,但是为了避免前面说的那些开销,它做了进一步完善。Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。(这样类似的运行方式,可以在不少的机器学习库中看到。)

使用TensorFlow之前,首先导入它:

import tensorflow as tf

我们通过操作符号变量来描述这些可交互的操作单元,可以用下面的方式创建一个:

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

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

我们的模型也需要权重值和偏置量,当然我们可以把它们当做是另外的输入(使用占位符),但TensorFlow有一个更好的方法来表示它们:Variable 。 一个Variable代表一个可修改的张量,存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修改。对于各种机器学习应用,一般都会有模型参数,可以用Variable表示。

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

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

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

现在,我们可以实现我们的模型啦。只需要一行代码!

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

首先,我们用tf.matmul(X,W)表示x乘以W,对应之前等式里面的,这里x是一个2维张量拥有多个输入。然后再加上b,把和输入到tf.nn.softmax函数里面。

至此,我们先用了几行简短的代码来设置变量,然后只用了一行代码来定义我们的模型。TensorFlow不仅仅可以使softmax回归模型计算变得特别简单,它也用这种非常灵活的方式来描述其他各种数值计算,从机器学习模型对物理学模拟仿真模型。一旦被定义好之后,我们的模型就可以在不同的设备上运行:计算机的CPU,GPU,甚至是手机!

原文地址:https://www.cnblogs.com/schips/p/12154316.html

时间: 2024-10-22 12:31:45

Ternsorflow 学习:004-MNIST 构建模型的相关文章

Ternsorflow 学习:005-MNIST 实现模型

前言 在上一讲中,我们通过分析选用了softmax模型,并用tf创建之.本讲的内容就是为了训练这个模型以便于测试. 训练模型 为了训练我们的模型,我们首先需要定义一个指标来评估这个模型是好的.其实,在机器学习,我们通常定义指标来表示一个模型是坏的,这个指标称为成本(cost)或损失(loss),然后尽量最小化这个指标. 用于衡量模型好坏的工具,可以称之为成本函数.有关概念 一个非常常见的,非常漂亮的成本函数是"交叉熵"(cross-entropy).交叉熵产生于信息论里面的信息压缩编码

Ternsorflow 学习:006-MNIST进阶 深入MNIST

前言 这篇文章适合实践过MNIST入门的人学习观看.没有看过MNIST基础的人请移步这里 深入MNIST TensorFlow是一个非常强大的用来做大规模数值计算的库.其所擅长的任务之一就是实现以及训练深度神经网络. 在本教程中,我们将学到构建一个TensorFlow模型的基本步骤,并将通过这些步骤为MNIST构建一个深度卷积神经网络. 这个教程假设你已经熟悉神经网络和MNIST数据集.如果你尚未了解,请查看新手指南. 安装 在创建模型之前,我们会先加载MNIST数据集,然后启动一个Tensor

V-rep学习笔记:机器人模型创建3—搭建动力学模型

接着之前写的V-rep学习笔记:机器人模型创建2-添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierarchy and finish the model definition).但是想要进行动力学仿真(碰撞.接触.自由落体...)的话,还需要进行额外的一些操作: Building the dynamic shapes VREP中几何体的属性可以分为: dynamic or static: 具有动态属性

时间序列深度学习:状态 LSTM 模型预测太阳黑子

时间序列深度学习:状态 LSTM 模型预测太阳黑子 本文翻译自<Time Series Deep Learning: Forecasting Sunspots With Keras Stateful Lstm In R> 原文链接 由于数据科学机器学习和深度学习的发展,时间序列预测在预测准确性方面取得了显着进展.随着这些 ML/DL 工具的发展,企业和金融机构现在可以通过应用这些新技术来解决旧问题,从而更好地进行预测.在本文中,我们展示了使用称为 LSTM(长短期记忆)的特殊类型深度学习模型,

U3D学习心得-----资源管理:模型和角色动画的输出设置(上)

模型主要可以以两种方式进行输出: (1)使用插件进行输出.并输出为指定的文件格式,如FBX或OBJ (2)直接输出为响应的3D应用文件,如.max或者Blen,Unity自身再进行转换. 使用3D软件包自身格式进行输出的优缺点: 优点:(1)快速的输出工程,直接从3D文件到Unity (2)简单的初始化过程 缺点:(1)文件中可能会包括不需要的数据. (2)若输出文件过大,可能会妨碍Unity的更新工程.比较少的数据检验过程,可能会增加出错的几率. 而使用插件进行输出的优缺点: 优点:(1)仅仅

增强学习 | 多臂赌博机模型进阶

“模型是一个框架,用来描述分析者感兴趣的研究对象” 上文[增强学习 | 多臂赌博机模型]介绍了基本的多臂赌博机模型,即单步动作会根据反馈直接作出决策,因此多臂赌博机的目标是学习策略函数,以产生最优的执行动作.介绍了两种学习最优策略的方法,一是使用平均累积函数,二是使用神经网络拟合.相比下,神经网络具有更强的表达能力,效果也更好. 但基本的多臂赌博机模型有两个限制,一是行动与环境状态无关:二是不能处理延时累积回报,这些因素限制了基本多臂赌博机模型的描述和解决现实更复杂问题的能力. 对于行动与环境状

PGM学习之二 PGM模型的分类与简介

废话:和上一次的文章确实隔了太久,希望趁暑期打酱油的时间,将之前学习的东西深入理解一下,同时尝试用Python写相关的机器学习代码. 一 PGM模型的分类 通过上一篇文章的介绍,相信大家对PGM的定义和大致应用场景有了粗略的了解.那么接下来我们来深入了解下PGM. 首先要介绍的是Probabilistic models(概率模型),常用来描述不同的随机变量之前的关系,主要针对变量或变量间的相互不确定性的概率关系建模.总的来说,概率模型分为两类: 一类是参数模型-可以用有限个参数进行准确定义 参数

学习使用CMake构建工程

本文记录学习使用CMake的过程. 安装CMake请参考: http://blog.csdn.net/alex_my/article/details/17310001 本文使用Win7X64, VS2012. 参考了这篇文章: http://blog.csdn.net/fan_hai_ping/article/details/8208898 本文所用到的代码已打包: http://download.csdn.net/detail/alex_my/6904069 请耐心一行行的看下去! 目录: 1

【qt学习004】对话框小结

第一部分,基本对话框告一段落. 书本上第一章节还介绍了制作抽屉效果.制作表格.制作进度条等节,但在我看来,似乎与前面的对话框制作方式大同小异,不值得费时费力地一一学习,所以跳过了,这一跳,就到了书本的50多页,七分之一的比例,进度神速啊,这样想想感觉倍儿爽,但或许我会后悔. 回顾整个第一章,有几个步骤属于通用的: 1. 继承public QDialog类. 2. 创建对象,有QLabel, QPushButton等. 3. 布局,暂时用到了QGridLayout类以及其方法addWidget,简