本主题内容:
Tensorflow的图的核心构成就是数据与数据操作,在Tensorflow中所有数据都表示成张量(Tensor),数据操作就是函数。
- 张量定义
- 张量使用
- TensorFlow 核心是由两个互相独立的部分组成:
1. 构建 计算图 (在API中使用 tf.Graph 实现)
2. 运行 计算图(在API中使用 tf.Session 实现)
在这里首先重点关注图的构建 -
图由两种类型的对象组成。
1. 张量: 图的边。它们代表流经图的值。在API中使用tf.Tensors表示。大多数 TensorFlow 函数会返回张量。
2. 操作(简称“op”): 操作描述了消耗和生成张量的计算。
一、张量定义
1. 张量的作用
- 张量作为图的核心要素,主要有两个基本作用:
- 作为操作的输入与输出,通过操作构成数据流。
- 通过tf.Session.run的调用,作为图计算的起点。
按照对最终张量的计算要求,沿着数据流调用操作,实现对整个复杂图的计算。
也可以使用t.eval() 调用执行,等价于tf.get_default_session().run(t)。
2. 张量类的API介绍
可以从Tensorflow的API参考文档获取张量Tensor类的帮助。
- 构造器
__init__( op, #操作名 value_index, #产生这个张量的操作的终结点的索引。 dtype #数据类型 )
- 属性
属性 | 属性说明 |
---|---|
device | 产生张量的设备,指的是CPU,GPU |
dtype | 数据类型 |
graph | 张量所在的图 |
name | 张量的字符串名 |
op | 输出张量的操作 |
shape | 张量形状(是TensorShape类型) |
value_index | 张量在操作的所有输出张量列表中的索引。 |
每个张量对象都是有 操作op 指令产生,Tensorflow提供常见 操作op 实现,用户也可以实现自己的 操作op 定义(比较麻烦,后面由专门主题解释)。可以调用操作构造器tf.matmul来创建 操作op 对象。
其中数据类型由Tensorflow内部定义:
数据类型 | 数据类型说明 |
---|---|
tf.float16 | 16-bit half-precision floating-point. |
tf.float32 | 32-bit single-precision floating-point. |
tf.float64 | 64-bit double-precision floating-point. |
tf.bfloat16 | 16-bit truncated floating-point. |
tf.complex64 | 64-bit single-precision complex. |
tf.complex128 | 128-bit double-precision complex. |
tf.int8 | 8-bit signed integer. |
tf.uint8 | 8-bit unsigned integer. |
tf.uint16 | 16-bit unsigned integer. |
tf.uint32 | 32-bit unsigned integer. |
tf.uint64 | 64-bit unsigned integer. |
tf.int16 | 16-bit signed integer. |
tf.int32 | 32-bit signed integer. |
tf.int64 | 64-bit signed integer. |
tf.bool | Boolean. |
tf.string | String. |
tf.qint8 | Quantized 8-bit signed integer. |
tf.quint8 | Quantized 8-bit unsigned integer. |
tf.qint16 | Quantized 16-bit signed integer. |
tf.quint16 | Quantized 16-bit unsigned integer. |
tf.qint32 | Quantized 32-bit signed integer. |
tf.resource | Handle to a mutable resource. |
tf.variant | Values of arbitrary types. |
提示:在张量shape的表示也需要注意,标量形状使用[ ]表示。
标量形状表示 [ ]:比如3
向量形状表示 [3]:比如[1., 2., 3.]
矩阵形状表述[2, 3]:表示行2列3的矩阵、
高阶张量形状表示[2,4,8]。
如果张量某个维度大小未知,在输入数据确定,可以使用None。
- 属性例子
#coding=utf-8 import tensorflow as tf ts = tf.constant(3.0, dtype=tf.float32) print("device:",ts.device) print("dtype:",ts.dtype) print("shape:",ts.shape) print("name:",ts.name) print("op:",ts.op) print("value_index:",ts.value_index) #从0开始
- 执行结果
Tensor属性例子
- 方法
Tensor的方法主要都是运算符号的重载实现(一般的数学运算表达式构成基础,比如:+,-等运算)。
Tensor内置函数 | 对应运算符号 |
---|---|
abs | tf.abs(x) 对复数计算方式为 |
add | x + y |
div | x / y |
floordiv | x // y (Python3) |
sub | x - y |
pow | x ** y 等价于 |
matmul | a * b,对向量就是内积(a @ b) |
mul | Dispatches cwise mul for "DenseDense" and "DenseSparse".稀疏与密集处理计算 |
mod | x % y |
neg | -x |
truediv | 此函数强制使用Python 3除法运算符语义,其中所有整数参数首先转换为浮点类型。 |
invert | ~ x |
and | x & y |
or | x | y |
xor | x ^ y |
bool | 把Tensor对象当bool值使用 |
nonzero | 防止把Tensor对象当bool值使用 |
radd | x+=y |
rdiv | x/=y |
rfloordiv | x//=y |
rmatmul | x*=y |
rmod | x%=y |
rmul | x*=y |
rpow | x**=y |
rsub | x-=y |
rtruediv | 此函数强制使用Python 3除法运算符语义,其中所有整数参数首先转换为浮点类型。 |
rand | x &= y |
rxor | x ^= y |
ror | x |= y |
eq | x == y |
ge | x >= y |
gt | x > y |
le | x <= y |
lt | x < y |
iter | 迭代器对象 |
getitem | []下标运算符,对标量无效 |
- 上述运算一般不直接调用,而是在Tensorflow中基本上都有对应函数,比如tf.add等。下面是例子:
x = tf.constant(-3.0, dtype=tf.float32) y = tf.constant(5.0, dtype=tf.float32) z = tf.constant(3-4j, dtype=tf.complex64) session=tf.Session() init_op=tf.global_variables_initializer() session.run(init_op) ats=tf.abs(z) print(session.run([z,ats])) print(session.run(tf.truediv(x,y)))
3. 定义张量对象
- 特殊的张量可以使用下面函数来构建
- tf.Variable
- tf.constant
- tf.placeholder
- tf.SparseTensor
除了 tf.Variable 以外,张量的值是不变的,这意味着对于单个执行任务,张量只有一个值。然而,两次评估同一张量可能会返回不同的值;
- Tensorflow的有返回值的函数基本上都返回张量类型的对象。
常用的是构建随机数据与连续序列数据:- tf.random_normal 正态分布
- tf.random_uniform 均匀分布
- tf.random_npoisson 泊松分布
- tf.random_gamma 伽马分布
- tf.range 连续序列
- tf.zeros
基本上在numpy中定义的变量方式在tensorflow都存在对应的方式。
二、张量使用
1. 张量的运算
- 下面个使用代码说明张量运算的两种方式。
x = tf.constant(-3.0, dtype=tf.float32) y = tf.constant(5.0, dtype=tf.float32) z = tf.constant(3-4j, dtype=tf.complex64) session=tf.Session() init_op=tf.global_variables_initializer() session.run(init_op) ats=tf.abs(z) #计算方式一 print(session.run([z,ats])) print(session.run(tf.truediv(x,y))) #计算方式二 print(ats.eval(session=session),z.eval(session=session)) print(tf.truediv(x,y).eval(session=session))
2. 张量作为输入参数
- Session.run函数介绍
run( fetches, feed_dict=None, #使用字典传递参数 options=None, run_metadata=None )
- 例子代码
#coding=utf-8 import tensorflow as tf x = tf.placeholder(tf.float32, []) #标量 y = tf.placeholder(tf.float32, []) #标量 r=1/2 *(x- y) #随机均方误差损失计算 session=tf.Session() init_op=tf.global_variables_initializer() session.run(init_op) #参数传递 re=session.run(r,feed_dict={x:10,y:20}) print(re)
- 注意:
其中字典的key必须是定义的张量名。
- 注意:
【资源】
- 文件:【 下载 】
- 1.t03_tensor.py
- 2.t03_tensor_input.py
网友评论