TensorFlow的基础概念
A machine learning platform for everyone to solve real problems.
开放源码软件库,用于进行高性能数值计算
Tensorflow的Hello World1
2
3
4
5
6
7import tensorflow as tf
hello = tf.constant("Hello,World!")
sess = tf.Session()
print(sess.run(hello))
Tensor 张量 数据结构:多维数组
Flow 流 计算模型: 张量之间通过计算而转换的过程
通过计算图的形式表述计算的编程系统,计算为节点,边描述计算之间的关系
计算图是一个有向图,由以下内容构成:
• 一组节点,每个节点都代表一个操作,是一种运算
• 一组有向边,每条边代表节点之间的关系(数据传递和控制依赖)
TensorFlow有两种边:
• 常规边(实线):代表数据依赖关系。一个节点的运算输出成为另一个节点的输入,两个节点之间有tensor流动( 值传递)
• 特殊边(虚线):不携带值,表示两个节点之间的 控制相关性。
比如, happens- - before 关系,源节点必须在目的节点执行前完成执行
计算图的实例1
2
3
4node1 = tf.constant(3.0,tf.float32,name='node1')
node2 = tf.constant(4.0,tf.float32,name='node2')
node3 = tf.add(node1,node2)
print(node3)
输出一个张量结构:1
Tensor("Add:0", shape=(), dtype=float32)
建立对话显示运行结果:1
2
3
4sess = tf.Session()
print("运行结果:",sess.run(node1))
sess.close()
张量的概念
在TensorFlow中,所有的数据都通过张量的形式来表示
• 从功能的角度,张量可以简单理解为多维数组
零阶张量表示标量(scalar),也就是 一个数;
一阶张量为向量(vector),也就是 一维数组;
n n 阶张量可以理解为一个 n 维数组;
• 张量并没有真正保存数字,它保存的是计算过程
张量的属性
1 | Tensor("Add:0", shape=(), dtype=float32) |
名字( name )
“node:src_output”:node 节点名称,src_output 来自节点的第几个输出
形状( shape )
张量的维度信息, shape=() ,表示是标量
类型( type )
每一个张量会有一个唯一的类型
TensorFlow会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错
张量的形状
三个术语描述张量的维度: 阶(rank)、 形状(shape) 、 维数(dimension number)
1 | tens1 = tf.constant([[[1,2,2],[2,2,3]], |
1 | scalar = tf.constant(100) |
(数组下标从0开始)
张量的类型
TensorFlow支持14种不同的类型
实数 tf.float32, tf.float64
整数 tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8
布尔 tf.bool
复数 tf.complex64, tf.complex128
张量的类型
默认类型:
不带小数点的数会被默认为int32
带小数点的会被默认为float32
操作
计算图中的 节点就是 操作(Operation)
• 一次加法是一个操作
• 一次乘法也是一个操作
• 构建一些变量的初始值也是一个操作
• 每个运算操作都有 属性,它在构建图的时候需要确定下来
• 操作可以和计算 设备绑定,指定操作在某个设备上执行
• 操作之间存在顺序关系,这些操作之间的 依赖就是“ 边”
• 如果操作A的输入是操作B执行的结果,那么这个操作A就依赖于操作B1
2
3
4
5
6
7
8
9
10
11tf.reset_default_graph()
a = tf.Variable(1,name = "a")
b = tf.add(a,1,name = "b")
c = tf.multiply(b,4,name = "c")
d = tf.subtract(c,b,name = "d")
logdir = 'E:\log'
writer = tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()
TensorFlow的基本运算
会话
会话11
2
3
4
5
6
7
8tens1 = tf.constant([1,2,3])
sess = tf.Session()
try:
print(sess.run(tens1))
except:
print('Exception!')
finally:
sess.close()
会话21
2with tf.Session() as sess:
print(sess.run(tens1))
在交互式环境下,Python脚本或者Jupyter编辑器下,通过设置默认会话来获取张量的取值更加方便
tf.InteractiveSession 使用这个函数会自动将生成的会话注册为默认会话
常量和变量
常量
在运行过程中值不会改变的单元,在TensorFlow中无须进行初始化操作
创建语句:1
constant_ name = tf.constant(value)
变量
在运行过程中值会改变的单元,在TensorFlow中须进行初始化操作
创建语句:1
name_variable = tf.Variable(value, name)
个别变量初始化:1
init_op = name_variable.initializer()
所有变量初始化:1
init_op = tf.global_variables_initializer()
变量的赋值
变量更新语句:1
update_op = tf.assign(variable_to_be_updated, new_value)
占位符
TensorFlow中的 Variable 变量类型,在定义时需要初始化,但有些变量定义时并不知道其数值,只有当真正开始运行程序时,才由外部输入,比如训练数据,这时候需要用到占位符
tf.placeholder 占位符,是TensorFlow中特有的一种数据结构,类似动态变量,函数的参数、或者C语言或者Python语言中格式化输出时的“%”占位符
TensorFlow占位符Placeholder,先定义一种数据,其参数为数据的Type和Shape
占位符Placeholder的函数接口如下:1
tf.placeholder(dtype, shape=None, name=None)
Feed提交数据和Fetch提取数据
1 | a = tf.placeholder(tf.float32,name='a') |
TensorBoard可视化初步
• TensorBoard是TensorFlow的可视化工具
• 通过TensorFlow程序运行过程中输出的日志文件可视化TensorFlow程序
的运行状态
• TensorBoard和TensorFlow程序跑在不同的进程中
TensorBoard不需要额外安装,在TensorFlow安装时已自动完成
在 Anaconda Prompt中先进入日志存放的目录( 非常重要!!!)
再运行TensorBoard,并将日志的地址指向程序日志输出的地址
命令:1
tensorboard --logdir=/path/log