Tensorflow入门(2)——Tensorflow基础
一、TensorFlow的概念
TensorFlow = Tensor + Flow
Tensor:张量 ;Flow:流
数据结构:多维数组
TensorFlow就是张量从流图的一端流动到另一端的过程,是一个通过计算图的形式表述计算的编程系统,每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的关系。
二、计算图(数据流图)的概念
计算图是一个有向图,由以下内容构成:
- 一组节点,每个节点都代表一个操作,是一种运算,也可以是输入的起点、输出的终点。
- 一组有向边,每条边代表节点之间的输入/输出关系(数据传递和控制依赖)
TensorFlow有两种边:
- 常规边(实线):代表数据依赖关系。一个节点的运算输出成为另一个节点的输入,两个节点之间有tensor流动(值传递)
- 特殊边(虚线):不携带值,表示两个节点之间的控制相关性。比如,happens-before关系,源节点必须在目的节点执行前完成执行
三、TensorFlow计算模型-计算图
之前在(一)中已经安装好了Anaconda,其中包含了Spyder和Jupyter等比较方便的Python编译软件,方便起见,我主要就在Jupyter上进行调试,下面是一个最基础的实例,是希望实现加法运算。
import tensorflow as tf
import os
# 一个简单计算图
# 此时还未进行计算,输出的是一个张量的结构
# 多次运行还可以发现add后的序号递增
node1=tf.constant(3.0,tf.float32,name="node1")
node2=tf.constant(4.0,tf.float32,name="node2")
node3=tf.add(node1,node2)
print(node3)
# 输出
# Tensor("Add:0", shape=(), dtype=float32)
创建计算图只是建立静态计算模型,执行对话才能提供数据并获得结果。什么意思呢,可以类比为我们只是创建了一个方法,例如准备了一个杯子,告诉你接下来这个杯子里将会装入果汁,此时,你知道它会被装入果汁,但是实际里面还是空的。
计算图就是这样一个张量结构,建立了一个静态模型,当我们创建会话(也就是Session)时,才能真正开始运行(榨果汁并装入杯子)。
上述代码运行完成后就有了以下结构


接着建立对话并运行,才能得到真正结果。
# 建立对话并运行
sess=tf.Session()
print(sess.run(node3))
# 关闭session,如果创建了太多对话,会把内存吃掉
sess.close()
# 输出
# 7.0
四、张量
1.张量的概念
在TensorFlow中,所有的数据都通过张量的形式来表示。从功能的角度,张量可以简单理解为多维数组。且如上所说,张量并没有真正保存数字,它保存的是计算过程。
- 零阶张量表示标量(scalar),也就是一个数;
- 一阶张量为向量(vector),也就是一维数组;
- n阶张量可以理解为一个n维数组;
2.张量的结构
Tensor("Add:0", shape=(), dtype=float32)
张量的属性
- 名字(name) :“node:src_output”:node 节点名称,src_output 来自节点的第几个输出
- 形状(shape) :张量的维度信息, shape=() ,表示是标量
- 类型(type) :每一个张量会有一个唯一的类型
3.张量的不同形状



4.张量的类型
TensorFlow支持14种不同的类型
- 实数 tf.float32, tf.float64
- 整数 tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8
- 布尔 tf.bool
- 复数 tf.complex64, tf.complex128
- 默认类型:不带小数点的数会被默认为int32 带小数点的会被默认为float32
TensorFlow会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错。
5.Operations
- 计算图中的节点就是操作(Operation)
- 一次加法是一个操作
- 一次乘法也是一个操作
- 构建一些变量的初始值也是一个操作
- 每个运算操作都有属性,它在构建图的时候需要确定下来
- 操作可以和计算设备绑定,指定操作在某个设备上执行
- 操作之间存在顺序关系,这些操作之间的依赖就是“边”
- 如果操作A的输入是操作B执行的结果,那么这个操作A就依赖于操作B
6.张量存储与可视化
import tensorflow as tf
tf.reset_default_graph() #清除default graph和不断增加的节点
# 定义变量a
a=tf.Variable(1,name="a")
# 定义b操作为a+1
b=tf.add(a,1,name="b")
# 定义c操作为b*4
c=tf.multiply(b,4,name="c")
# 定义d为c-b
d=tf.subtract(c,b,name="d")
# 设置一条合适的路径
logdir="D:/Project/Python/Tensorflow"
# 生产一个写日志的writer,将当前的图写入日志
writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()
运行后在指定目录产生了日志文件 
在Anaconda Prompt中先进入日志存放的目录(非常重要!!!)再运行TensorBoard,并将日志的地址指向程序日志输出的地址
命令:tensorboard --logdir=/path/log,启动服务的端口默认为6006;使用 --port 参数可以改编启动服务的端口

在浏览器进入对应端口,如我的是http://localhost:6006/,在GRAPHS可以可视化模型,各节点可以进一步展开

五、会话
- 会话模式1
此会话方法需要进行close来释放资源,如果不关闭或者异常退出的话可能就会导致资源泄露
- 会话模式2

- 会话模式3

- 指定默认的会话
TensorFlow不会自动生成默认的会话,需要手动指定 。当默认的会话被指定之后可以通过 tf.Tensor.eval 函数来计算一个张量的取值。

- 交互环境下设置默认会话
在交互式环境下,Python脚本或者Jupyter编辑器下,通过设置默认会话来获取张量的取值更加方便。 tf.InteractiveSession 使用这个函数会自动将生成的会话注册为默认会话

六、常量与变量
常量:在运行过程中值不会改变的单元,在TensorFlow中无须进行初始化,操作创建语句为constant_ name = tf.constant(value)
变量:在运行过程中值会改变的单元,在TensorFlow中须进行初始化操作,创建语句为name_variable = tf.Variable(value, name)
- 个别变量初始化:init_op = name_variable.initializer()
- 所有变量初始化:init_op = tf.global_variables_initializer()
变量赋值:与传统编程语言不同,TensorFlow中的变量定义后,一般无需人工赋值,系统会根据算法模 型,训练优化过程中自动调整变量对应的数值特殊情况需要人工更新的,可用变量赋值语句变量更新语句update_op = tf.assign(variable_to_be_updated, new_value)
import tensorflow as tf
# 通过变量赋值输出1、2、3。。10
value=tf.Variable(0,name="value") # 变量
one=tf.constant(1) # 常量
new_value=tf.add(value,one) # 加法
update_value=tf.assign(value,new_value) #赋值
init=tf.global_variables_initializer() # 所有变量初始化
# 会话
with tf.Session() as sess:
sess.run(init)
for _ in range(10):
sess.run(update_value)
print(sess.run(value))
# 输出
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
七、占位符
1.接口
TensorFlow中的Variable变量类型,在定义时需要初始化,但有些变量定义时并不知道其数 值,只有当真正开始运行程序时,才由外部输入,比如训练数据,这时候需要用到占位符。TensorFlow占位符Placeholder,先定义一种数据,其参数为数据的Type和Shape。
占位符Placeholder的函数接口:tf.placeholder(dtype, shape=None, name=None)

2.Feed
如果构建了一个包含placeholder操作的计算图,当在session中调用run方法时,placeholder占用的变量必须通过feed_dict参数传递进去,否则报错。多个操作可以通过一次Feed完成执行 (图右)


一次返回多个值分别赋给多个变量。

八、Tensorflow常用API



浙公网安备 33010602011771号