10分钟快速理解tensorflow结构
2018-10-01 本文已影响0人
pualrdwade
本教程属于基础教程,作者本身也在慢慢学习神经网络的知识,在此只想把一些自己的想法和理解,结合自己的经验写下来给大家做一个参考,新人通过这样一篇'教程大致上可以快速了解tensorflow库的基本结构以及工作流程,适合入门者观看,大约只需要10分钟,我也写的比较简单通俗,希望可以给需要的人带来一些帮助
- 张量(
tensor
)的基本创建与操作
import tensorflow as tf
# 默认的数据类型为int类型
data1 = tf.constant([[1,2,3],[4,5,6]])
print(data1)
Tensor("Const:0", shape=(2, 3), dtype=int32)
# 可以查看张量的类型
print(type(data1))
<class 'tensorflow.python.framework.ops.Tensor'>
可以看到,tensorflow
的张量tensor
可以使用tf.constant
进行创建,实际上是对tensor类构造的封装
# 也可以自己指定数据类型
data2 = tf.constant([[1,3,4],[5,3,2]],dtype=tf.float32)
print(data2)
Tensor("Const_1:0", shape=(2, 3), dtype=float32)
我们可以发现目前打印只能够查看到tensor
的属性,并不能看到tensor的值,其实这边是整个tensorflow的核心思想,数据与计算被组织成为一个数据流图
,如果想要打印,我们则需要创建这个图
的一个会话Session
,这便是与图
进行交互的外部接口
# 首先创建session
sess = tf.Session()
# 使用run()方法访问数据节点
print(sess.run(data2))
[[1. 3. 4.]
[5. 3. 2.]]
- 数据流图(Graph)
数据流图是一种常用的并行计算编程模型,并不是针对于深度学习而设计的,数据流图有两个基本的结构:节点
,线
-
节点
表示计算单元 -
线
表示节点之间的输入输出关系
在tensorflow
的整个过程中,tensor
(张量)通过线在各个节点之间进行流动传输(flow
),由此便得到了生动的名字:tensorflow
- 构建计算图
tensor不但可以表示输入输出的端点,同时还可以作为运算单元而存在
# 下面是个例子,定义一个加法单元的tensor并且使用session来运行
import tensorflow as tf
const1 = tf.constant(1.2)
const2 = tf.constant(3.5)
adder = const1+const2
sess = tf.Session()
sess.run(adder)
4.7
可以发现确实是可以作为单独而存在的一个计算单元,我们可以打印查看详细的属性
print(adder)
Tensor("add_1:0", shape=(), dtype=float32)
上面的例子中,我们发现这样是有缺陷的,我们希望在运行的时候给图
传入参数,输出得到不同的结果,这种情况我们可以使用tensorflow
的变量(占位符)(placeholder
)来创建我们的图
结构
# 我们使用变量来构建一个图,同时传入参数得到不同的输出
import tensorflow as tf
v1 = tf.placeholder(tf.float32)
v2 = tf.placeholder(tf.float32)
adder = v1 + v2
# 打印三个节点,查看属性
print(v1)
print(v2)
print(adder)
# 使用session运行,同时传入参数(使用字典的方式传参)
sess = tf.Session()
print(sess.run(adder,{v1:2.2,v2:3.2}))
Tensor("Placeholder_2:0", dtype=float32)
Tensor("Placeholder_3:0", dtype=float32)
Tensor("add_3:0", dtype=float32)
5.4
在此基础上,我们可以使用函数式编程的思想,对构造的tensor
进行封装,从而不断构造更加复杂的功能
# 对adder节点构造更加复杂的操作
x = tf.placeholder(tf.float32)
adder_mul_x = adder * x
# 使用session运行
sess = tf.Session()
sess.run(adder_mul_x,{v1:3.9,v2:4,x:2})
15.8
需要注意的是,每次对一个数据流上的节点添加占位符时,使用session运行都要补全所有的placeholder
,否则会导致参数错误而报错