第一篇
参考《TensorFlow实战Google深度学习框架》
首先是TensorFlow环境搭建,这里我用的最简单搭建方法,python3.5.2安装好之后,下载pip安装文件,然后解压,配置环境变量Path,如果你是用CPU的话可以用命令pip3 install –upgrade tensorflow,如果你的是GPU支持的话可以用命令pip3 install –upgrade $TF_BINARY_URL。我用的是第一种(因为电脑太渣,只能将就着来了)。不过这种安装方法不如使用无版图安装出来的界面友好,这个实在python的IDE里面直接敲代码。Tensorflow安装好了,再进入手写数字识别之前,首先我要介绍一下即将用到的一些名词含义和函数的意思(作为小白的我在这方面吃了一点苦头)。
- tensorflow tensor即张量的意思,张量有三个属性,分别是名字(name),维度 (shape)和类型(type)。第一个属性name,不仅是张量的唯一标示符,它同样也给出了这 个张量是如何计算出来的。第二个属性shape,描述了一个张量的维度信息,如shape=(2,),说明了张量是一个一维数组,这个数组的长度是2。第三个属性type,每一个张量会有一个唯一的类型,类型不匹配的时候会报错。张量在什么地方使用呢?第一类用途就是对中间计算结果的引用,比如在卷积神经网络中,卷积层或者池化层有可能改变张量的维度,通过result.get_shape函数来获取结果张量的维度信息可以免去人工计算的麻烦。第二类用途就是当计算图狗仔完成之后,张量可以用来计算结果,也就是得到真实的数字。
2.Session 在tensorflow中必不可少的会话,使用创建好的会话可以得关心的运算结果。如下所示:
Import tensorflow as tf
//创建一个会话
with tf.Session() as sess
//使用创建好的会话来得到结果
sess.run(…)
//不需要调用close方法来释放资源,当上下文推出的时,会话关闭和资源释放会自动完成特征向量 所有用于描述实体的数字的组合 就是一个实体的特征向量(feature vector)。
前向传播算法 前向传播算法,一个神经元有多个输入和一个输出,每个神经元的输入既可以是其他神经元的输入,也可以是整个神经网络的输入。我之前写过一篇最基础的神经网络博文,感知机就是一个最简单的前向传播算法的例子。
Variable tf.Variable的作用就是保存和更新神经网络中的参数。
random_normal 该函数可以通过参数mean来指定平均值,在没有指定时默认为0.
tf.random_normal([a,b],stddev=c,seed)会产生一个axb的矩阵,矩阵中的元素都为0,标准差为才的随机数。该函数式通过满足正太分布的随机数来初始化神经网络中的参数。以下函数都是tensorflow随机数生成的函数
函数名称 随机数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 正太分布,如果随机出来的偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最小、最大取值,取值类型
tf.random_gamma Gamma分布 形状参数alpha、尺度参数beta,取值类型介绍一下tensorflow的常数生成函数
函数名称 功能 样例
tf.zeros 产生全为0的数组 tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]]
tf.ones 产生全为1的数组 tf.ones([2,3],int32)->[[1,1,1],[1,1,1]]
tf.fill 产生一个全部为给定数字的数组tf.fill([2,3],9)->[[9,9,9],[9,9,9]]
tf.constant 产生一个给定值常量 tf.constant([1,2,3])->[1,2,3]在神经网络中,最常用的算法是反向传播算法(backpropagation) 反向传播算法的流程如下图所示:
从上图可以看出,反向传播算法实现了一个迭代过程。在每次迭代的时候,首先需要选取一小部分训练数据,这一小部分数据叫做一个batch。然后,这个batch的样例会通过向前传播算法得到神经网络模型的预测结果。因为训练数据都是正确答案标注的,所以可以计算出当前神经网络的预测答案和正确答案之间的距离,最后,给予这个预测值和真实值之间的差距,反向传播算法会相应更新神经网络参数的取值,是的在这个batch上神经网络模型的预测结果和真实答案更加接近。
Placeholder tf.placeholder(type,shape,name),这是一个占位符,通常情况下定义x和y_。
feed_dict 是一个字典(map),在字典中需要给出每个placeholder的取值,如果有需要的placeholder没有给定值会报错。
线性模型 假设一个模型的输出y和输入xi满足一下关系,那么这个模型就是一个线性模型。Y=∑wixi+b,其中,wi,,b∈R为模型参数。在线性模型中,模型的输出为输入的加权和。线性模型最大的特点是任意线性模型的组合仍然是线性模型。
损失函数 交叉商刻画了两个概率分布之间的距离,他是分类问题中使用比较广泛的一种损失函数。通过q来表示p的交叉商为:H(p,q)=-∑p(x)logq(x),概率分布刻画了不同事件的发生概率,然而神经网络不一定是一个概率分布。在tensorflow中softmax回归就是常用交叉商的一个方法。Softmax(y)i=y’=eyi/∑eyi,可以看出,原始的神经网络输出被用作置信度来生成新的输出。当交叉商作为softmax的损失函数时,p代表的是正确答案,q代表的是预测值。交叉商刻画了两个概率分布的距离,也就是说交叉商越小,两个概率分布里的越接近。
Clip_by_value tf.clip_by_value(v,a,b),在矩阵v中的数值要在[a,b]之间,大于b的换成b,小于a的换成a。即这个函数将一个张量中的数值限制在一个范围之内。
均方误差 (MSE,mean squared error) MSE(y,y’)=∑(yi-yi’)2/n,是回归问题常用的损失函数。
greater tf.greater(v1,v2),输入的是两个张量,此函数比较这两个输入张量中每一个元素的结果,并返回比较结果,true和false。
select tf.select(bool,v1,v2),select通常配合greater使用,有三个参数,第一个为选择条件的依据, 当选择条件为true时,会选择第二参数中的值,当选择条件为false时,会选择第三个参数中的值。
exponential_decy 函数实现了指数衰减学习率,通过这个函数可以使用较大的学习率来加快速度得到一个较优解,随着迭代继续学习,使模型在训练后期更加稳定。