从零开始学深度学习一:TensorFlow基础

本课程笔记来源于深享网课程《深度学习理论与实战TensorFlow》

一、TensorFlow的介绍

TensorFlow是一种利用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图中的边则代表在这些节点之间传递的多维数组(张量)。这种灵活的架构可让你使用一个API将计算工作部署到桌面设备、服务器或者移动设备的一个或多个CPU 、GPU上。
从零开始学深度学习一:TensorFlow基础
简单的说:TensorFlow是一个深度学习库,他是基于计算图的深度学习库,可以用它多快好省的完成目前绝大部分深度学习任务。

复杂的说:它具有更广泛的应用领域,良好的语言支持,部署性能等优点,同时他是如今最广泛使用的深度学习框架,使用的公司包括Google、Uber等。
从零开始学深度学习一:TensorFlow基础
自从TensorFlow面世以来,他得到了极大的关注, 并且逐步超过其他深度学习框架,可以说这就是当前最热门的深度学习框架了。

二、 TensorFlow基础1(计算图、session、Tensor)

2.1、构造图

首先我们来看一个实例,对于如下两行代码,其实他们就是定义了TensorFlow下的数a和b,我们将其称为tensor(张量)。

a=tf.constant(32)
b=tf.constant(10)

然后我们通过加分运算将这两个数生成一个新的数c

c=tf.add(a,b)

在TensorFlow中,上述过程就称为“构造图”,在构造整个计算图的过程中,如果我们打印其中的Tensor

print(a)
print(b)
print(c)

我们会发现并不会得到具体的数值,原因是TensorFlow是将Tensor作为节点保存,并没有进行相应的计算,所以没有具体的数值。
为了能得到相应的数值,我们需要引入Session。

2.2开启Session

Session可以运行图中所有的Tensor,并对其进行保存。

# 开启Session语法
sess=tf.Session

print(sess.run(a))
print(sess.run([a,b]))
print(sess.run([a,b,c]))

y用上述代码就可以得到相应的数值为
32
[32,10]
[32,10,42]
除了上述方法以外,也可以用变量替换的方法完成上述目标。

py_a=sess.run(a)
print(type(py_a))
print(py_a)

py_r=sess.run([a,b,c])
print(type(py_r))
print(py_r[0],py_r[1],py_r[2])

用这个方法,不仅可以输出相应的数值,还可以得到数据类型。
输出结果为:
<type ‘numpy.int32’>
32
<type ‘list’>
(32,10,42)

执行图

接下来,我们对上述内容进行总结,TensorFlow运行图中tensor的过程称为“执行图”,在TensorFlow中,图的构造和执行是分离的,所以TensorFlow是一个静态图模式,一旦图被定义好了,它的执行是固定的,不再会发生变化。
这个过程可以用下图来帮助理解。从零开始学深度学习一:TensorFlow基础

Tensor

Tensor即张量,在TensorFlow中所有的数据都是用tensor的形式给出,我们之前接触的数、一维向量、矩阵乃至多维矩阵都是属于tensor的范畴。从零开始学深度学习一:TensorFlow基础

tensor有各种类型,同时也可以对tensor进行命名。
从零开始学深度学习一:TensorFlow基础

mat

我们可以用mat对TensorFlow中的相关矩阵进行操作,如矩阵形状的改变和相关运算。

mat_a=tf.constant([1,2,3,4])
#从四维向量生成(2,2)的矩阵
mat_a=tf,reshape(mat_a,(2,2))

mat_b=tf,constant([1,3,5,7,9,11])
#生成(2,3)的矩阵
mat_b=tf.reshape(mat_b,(2,3))

随机化生成

在实际运用中,我们经常要用到各种随机化数据,TensorFlow为我们提供了多种随机化的方式。如:

#标准正态分布随机
rand_normal=tf.random_normal((),mean=0.0,stddv=1.0,dtype=tf.float32,seed=None)

#truncated 正态随机
truncated_normal=tf.truncated_normal((),mean=0.0,stddev=1.0,dtype=tf.float32,seed=None)

#均匀分布随机
rand_uniform=tf.random_uniform((),minval=0.0,maxval=1.0,dtype=tf.float32,seed=None)

Variable

我们之前介绍的constant是一个常量,不可以进一步修改,这里我们提出的Variable是TensorFlow下可以修改的tensor,他需要定义一个初始值,可以是数值,列表或numpy矩阵,也可以直接是tensor,和tensor一样,print也不能获得具体的值。

var_a=tf.Variable(0,dtype=tf.int32)
var_b=tf.Variable([1,2],dtype=float32)
var_w=tf.Variable(tf.zerons((1024,10)))

上述代码输出如下:
从零开始学深度学习一:TensorFlow基础
在我们使用variable时,我们必须先初始化这个variable,也就是调用他们的初始方法。

#开启交互式session
sess=tf.lnteractiveSession()

#一次性初始化所有的变量
init=tf.global_variables_initializer()

#一般session的方法
sess.run(init)
## InteractiveSession的方法
init.run()

##初始化某些变量
init_ab=tf.variables_initializer([var_a,var_b])
init_ab.run()
##初始化某个变量
var_w.initializer.run()

和tensor相同,我们想要获得variable的值同样需要通过session来完成。

W=tf.Variable(10)
sess.run(W.initizlizer)

print(W)
print(sess.run(W))
print(W.eval())

代码的输出为:
从零开始学深度学习一:TensorFlow基础
variable是一个变量,我们可以通过assign对variable进行赋值,但是这一个操作必须在执行之后才会产生效果,如下面的代码:

W.assign(100)
W.initializer.run()
print(W.eval(sess))

上述代码的赋值语句没有被执行,输出为10

assign_op=W.assign(100)
W.initializer.run()
assign_op.eval()
print(W.eval())

上述代码的赋值语句被执行了,所以输出为100

占位符

图的节点可以没有具体的值,TensorFlow根据这个逻辑定制了占位符(placeholder)的概念,它在构件图的时候占据图中的一个位置,然后在执行图的过程中才会带入具体的值。

#定义一个占位符
#tf.placeholder(dtype,shape=None,name=None)

#定义一个float32型的占位符,它是一个长为3的向量
a=tf.placeholder(tf.float32,shape=[3])

#定义一个bool型的占位符,它是一个1*2的矩阵
b=tf.placeholder(tf.bool,shape=[1,2])

正如前面所述的,既然placeholder没有具体的值,那么我们在执行图的过程中要填入具体的值,这时候我们需要一个字典来完成这个过程,它的key是怕placeholder,value就是具体的值,这个就是feed_dict.

print(sess.run(a,feed_dict={a:[1,2,3]}))
print(sess.run([a,b],feed_dict={a:[1,2,3],b:[[True,Flase]]}))

输出为:
从零开始学深度学习一:TensorFlow基础

Graph

Tensorflow是通过定义静态图的方法来运行的,我们当然可以获得这张计算图,这张图就是前面定义的所有tensor的集合。之后,我们可以查看当前定义计算图的所有信息,比如举一个例子,我们可以查看当前所有定义过的tensor信息。

g=tf.get_default_graph

输出为
从零开始学深度学习一:TensorFlow基础
我们也可以通过名字获得之前定义过的tensor_by_name(‘Hello:0’)

what_is_this=g.get_tensor_by_name('Hello:0')
print(what_is_this.eval())

输出为:Hello

除此以外,tensorflow还提供了非常厉害的TensorFlowboard工具可视化这个图。具体过程如下:
1、首先将当前图写入硬盘中

with tf.Session() as sess:
	graph_writer=tf.summary.FileWriter('.',sess.graph)

2、然后在当前目录就会出现一个“events.*”的文件
3、然后我们在当前目录打开终端,键入以下命令:

$ tensorflowboard-logdir=.

4、然后就会出现输出:

 $ Tensorboard 0.1.8 at http;// USERNAME:6006(press CTRL+C to quit)

5、然后打开浏览器,把at后面的链接输出即可。

总结

本部分主要讲了TensorFlow的各个关键部分,比如对运行机制的理解,tensor,variable,placeholder的定义,graph的使用和可视化等。