- TensorFlow计算模型—计算图
1,概念
①TensorFlow=Tensor + Flow
Tensor 张量
Tensorflow中,所有的数据都通过张量的形式来表示
张量没有真正保存数字,二十保存的是计算过程
数据结构:多维数组
Flow 流
计算模型:张量之间通过计算而转换的过程
基础代码:
Ⅰ
import tensorflow as tf#导入tensorflow模型 hello=tf.constant("hello world")#定义常量并赋值 sess=tf.Session()#开启会话 print(sess.run(hello))#运行会话并打印
输出结果:b'hello world'
Ⅱ
#一个简单计算图
import tensorflow as tf node1=tf.constant(3.0,tf.float32,name="node1") node2=tf.constant(4.0,tf.float32,name="node2") node3=tf.add(node1,node2) sess=tf.Session() print(sess.run(node3))
输出结果:7.0
②张量的属性
Tensor("node1:0", shape=(), dtype=float32)
Name:节点名称
shape:张量的维度信息,shape=()表示标量
Type:每个张量都有唯一类型
③张量的形状
阶(rank)、形状(shape)、维数(dimension number)
import tensorflow as tf tens1=tf.constant([[[1,2,2],[2,2,3]], [[3,5,6],[5,4,3]], [[7,0,1],[5,4,3]], [[11,12,7],[1,3,14]]],name="tensor1") #语句包含[],{},()括号中间换行就不需要使用多行连接符 print(tens1)
输出结果:Tensor("tensor1:0", shape=(4, 2, 3), dtype=int32)
shape=(4, 2, 3):三个元素表示三维数组,最外围数字有4个元素,也就是4个2为数组,往里一层一个2维数组有2个元素,也就是有2个一维数组,再往里一层一个一维数组有3个元素,也就是3个元素
import tensorflow as tf scalar=tf.constant(100) vector=tf.constant([1,2,3,4,5]) matrix=tf.constant([[1,2,3],[4,5,6]]) cube_martix=tf.constant([[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]) #语句包含[],{},()括号中间换行就不需要使用多行连接符 print(scalar.get_shape()) print(vector.get_shape()) print(matrix.get_shape()) print(cube_martix.get_shape())
输出结果:
()
(5,)
(2, 3)
(3, 3, 1)
④张量的阶
表征张量的维度⑤获取张量的元素
阶为1的张量等价于向量
阶为2的张量等价于矩阵,通过t[i,j]获取元素
阶为3的张量,通过t[i,j,k]获取元素
import tensorflow as tf tens1=tf.constant([[[1,2],[2,3]],[[3,4],[5,6]]]) sess=tf.Session() print(sess.run(tens1)[1,1,0]) sess.close()
#下标从0开始
输出结果:5
⑥张量的类型
Tensorflow支持14种不同类型
实数 tf.float32 , tf.float64
整数 tf.int8 ,tf.int16,tf.int64,tf.uint8
布尔 tf.bool
负数 tf.complex64,tf.complex128
默认类型:不带小数点的数会默认为int32
带小数点的会被默认为float32
import tensorflow as tf a=tf.constant([1,2],name="a") b=tf.constant([2.0,3.0],name="b") renult=a+b
输出结果:TypeError: Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
Tensorflow会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错.
2,操作
计算图中的节点就是操作;加法,乘法,构建变量都是操作
每个运算操作都有属性,再构建图的时候需要确定下来。
操作之间存在顺序关系,操作之间的依赖就是“边”,如果操作a的输出是操作b执行的结果,那么这个操作a就依赖与操作b
import tensorflow as tf#导入tensorflow模型 tf.reset_default_graph()#清楚默认图和不断增加的节点 #定义变量a a=tf.Variable(1,name="a") #定义操作b b=tf.add(a,1,name="b") #定义操作c为b*4 c=tf.multiply(b,4,name="c") #定义d为c-d d=tf.subtract(c,b,name="d") #存放文件路径 logdir='D:/pycharm project/logs' #生成一个写日志的writer,并将当前的tensorflow计算图写入日志 writer=tf.summary.FileWriter(logdir,tf.get_default_graph()) writer.close()
计算图:
3,TensorFlow是一个通过计算图的形式表述计算的编程系统,每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的关系。
抽象出来就是点和边的关系
计算图是一个有向图,由以下内容构成:
一组节点,每个节点都代表一个操作,是一种运算
一组有向边,每条边代表节点之间的关系(数据传递和控制依赖)
TensorFlow有两种边:
常规边(实现):代表数据依赖关系。一个节点的运算输出成为另一个节点的输入,两个节点之间有tensor流动(值传递)
特殊边(虚线):不携带值,便是两个节点之间的控制相关性。
import tensorflow as tf node1=tf.constant(3.0,tf.float32,name="node1") node2=tf.constant(4.0,tf.float32,name="node2") node3=tf.add(node1,node2) sess=tf.Session() print(node1)
输出结果:Tensor("node1:0", shape=(), dtype=float32)
输出的结果不是一个数字而是一个张量的结构
创建流图(计算图),就是建立计算模型,执行会话才能提供数据并获得结果