最近了解一下机器学习,顺便写一下文章吧,看了一下机器学习的书,真是云里雾里的,希望tensorflow这个机器学习框架能够让我有更新的认识吧。希望能对未来有所帮助。
没有事情,我就百度了一下tensorflow的文章,希望能从别人的博客中学到点东西,光看也没有意思,我顺便也抄袭一下吧。
什么是tensorflow:谷歌开源的机器学习框架。拥有易用的python接口,可以部署在一台或多台cpu,gpu上。兼容多个平台,拥有tensorboard可视化工具,可以使用checkpoint进行实验管理。
tensorflow,基础
实际上编写tensorflow可以总结为两步。
1.组装一个graph
2.使用session去执行graph中的operation
因此我们从graph与session说起
1.计算图
tensorflow是基于计算图的框架,因此理解graph与session尤其重要
当需要计算e的时候,就需要计算c与d,当计算c就需要计算a与b,计算d需要计算b,这样就形成依赖关系。这种有向环图就叫做计算图。因此对于图中的每个节点其微分都很容易得出,因此应用链式法则要起得一个复杂的表达式的导数久称为可能。
2.概念说明
下面是graph,session,operation,tensor四个概念简介
tensor:类型化的多位数组,图的边。
opteration:执行计算的单元,图的节点。
graph:一张有边与点的图,其实表示需要计算的任务。
session:称之为会话上下文,用于执行图
graph仅仅定义为所有opteration与tensor流向。没有进行任何运算。而session根据graph的定义分配资源,计算operation,得出结果。既然是图就会有点与边,在图计算中operation就是点而tensor就是边。operation可以是加减乘除等数学运算,也可以是各种各样的优化算法。每个operation就会有零个或多个输入,零个或多个输出。tensor就是其输入和输出。其实可以表示一维二维多位向量或者常量。而且除了variables指向的tensor外,所有的tensor在流向下一个节点后不再保存。
3.举例
首先定义一个图,(其实没有必要,tensorflow默认会定义)并做一些计算
import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
foo = tf.Variable(3,name=’foo’)
bar = tf.Variable(2,name=’bar’)
result = foo + bar
initialize = tf.global_variables_initiallizer()
print(result)
这段代码首先会加载tensorflow,定义一个graph类,并在这张图上定义一个foo和bar,最后对这两个值求和,并初始化所有变量,其中,Variable是定义变量并赋予初始值。让我们看下result最后执行,我们可以看到并没有输入结果,由此可见定义图的时候病没有进行运算。
下面定义一个session,并进行真正的运算
with tf.Session(graph=graph) as sess:
sess.run(initialize)
res = sess.run(result)
print(res) # 5
这段代码中定义一个session,并进行真正的运算。
可以看到在session中产生真正的运算,得出值为5.
下图是该graph在tensorboard中显示,这张图整体是个graph,其中foo,bar,add这些节点是operation,而foo和bar与add链接边的就是tensor。当session运行result那么该节点将不会进行计算,这也是图计算的优势。
数据结构
tensorflow的数据结构有rank,shape,data,types
rank:一般指数据的维度,其与线性代数中的rank不同,举例如下
scalar | s = 483
vector | v= [1.1,2.2,3.3]
matrix | m = [[1,2,3],[4,5,6]]
3-tensor | m = [[[2],[4]]]
n-tensor | …
shape是指tensor每个维度数组的个数
0 | 0-D
vector |1-D | v= [1.1,2.2,3.3]
matrix |2-D | m = [[1,2,3],[4,5,6]]
3-tensor |3-D | m = [[[2],[4]]]
n-tensor |4-D | …
data type:单个数据的类型,常用DT_FLOAT
DT_FLOAT | tf.float32
DT_DUBLE |tf.float64
DT_INT8 |tf.int8
DT_INT16 |tf.int16
DT_INT32 |tf.int32
DT_INT64 |tf.int64
DT_UINT8 |tf.uint8
DT_UINT16 |…
DT_STRING
DT_BOOL
DT_COMPLEX64
DT_COMPLEX128
DT_QINT8
DT_QINT32
DT_QUINT8
3.Variables
当训练模型时需要variables保存与更新参数。variables会保存在内存中,所有tensor艺丹拥有variables的指向就不会在session中丢失,其必须明确初始化,而且可以通过saver保存在磁盘上,variables可以通过variables初始化。
weights = tf.Variable(tf.random([784,200], stddev=0.35), name=”weights”)
biases = tf.Variable(tf.zeros([200]), name = “biases”)
其中tf.random()是随机生成一个正态分布的tensor,其中shape是第一个参数,stddev是其标准差,tf.zeros是生成全零的tensor,之后是将这个tensor的值赋给Variable。
2.初始化
实际在其初始化过程中做了很多操作,比如初始化空间,赋初始值,并把Variable添加到graph中等操作。注意在计算之前需要初始化所有的variable,一般会在定义graph时定义grobal_variable_initializer,其会在session运算时初始化所有变量。
直接调用global_variables_initiallizer 会初始化所有的Variable,如果仅想初始化部分,可以调用
tf.variables_initializer
variables 可以通过eval显示其值,也可以通过assign进行赋值。variable支持很多数学运算。
3.varable和constant的区别
值得注意的是variables与constant的区别,constant一般是常量,可以被赋值给variiables,constant保存在graph中,如果graph重复载入,那么constant也会重复载入,其非常浪费资源,如果非必要尽量不要使用其保存大量数据,而variables在每个session中都是单独保存的,甚至是可以单独存在参数服务器上,可以通过代码观察到constant实际是保存在graph中,具体如下
const = tf.condtant(1.0, name=”constant”)
print(tf.get_default_graph().as_graph_def())
4.命名
注意:尽量每个变量都要有明确的命名,这样易于管理命名空间,而且在导入模型的时候不会造成模型之间的命名冲突。
4.placeholder与feed_dict
当我们定义一张graph时,有时候并不需要计算的值,比如模型的输入数据,其只有在训练与预测中才会有值,这时候就需要placeholder和feed_dict
定义一个placeholder
foo = tf.placeholder(tf.int32 ,shape[1], name=”foo”)
bar = tf.constant(2,name = “bar”)
result = foo + bar
with tf.Session() as sess:
print(sess.run(result))
在上面的代码中会抛出错误。因为result计算需要foo的具体值,而在代码中并没有给出。
这时候需要将实际值给foo。最后一行修改如下
print(sess.run(result,{foo:[3]}))
3.mnist识别实例
介绍一些tensorflow基础之后,我们用一个完整的例子串联
首先需要下载数据集,mnist
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“MNIST_data/“,one_hot=True)