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

 
posted @ 2020-07-08 09:32  大帅本帅  阅读(27)  评论(0)    收藏  举报