TensorFlow操作符
Tensor
张量:n-dimensional array,类型化的多维数组
- TF使用Tensor表示所有的数据
- Tensor包含一个静态类型rank、一个shape
- TF会将python原生类型转换为相应的Tensor
- 0-d tensor:scalar
- 1-d tensor:vector,1d-array
- 2-d tensor:matrix,2d-array
Data Type
TF被设计为和numpy可以无缝结合
- TF的变量类型基于numpy变量类型:
tf.int32==np.int32
- bool、numeric等大部分类型可以不加转换的使用TF、np 变量类型
- TF、np中string类型不完全一样,但TF仍然可以从numpy 中导入string数组,但是不能在numpy中指定类型
- TF的变量类型基于numpy变量类型:
但尽量使用TF变量类型
- python原生类型:没有细分类型,TF需要推断类型
- numpy类型:numpy不兼容GPU,也不能自动计算衍生类型
数据类型 | 说明 |
---|---|
tf.float16 |
16-bit half-precision floating-point |
tf.float32 |
32-bit single-presicion floating-point |
tf.float64 |
64-bit double-presicion floating-point |
tf.bfloat16 |
16-bit truncated floating-point |
tf.complex64 |
64-bit single-presicion complex |
tf.complex128 |
128-bit double-presicion complex |
tf.int8 |
8-bit signed integer |
tf.uint8 |
8-bit unsigned integer |
tf.int16 |
|
tf.uint16 |
|
tf.int32 |
|
tf.int64 |
|
tf.bool |
|
tf.string |
|
tf.qint8 |
quantized 8-bit signed integer |
tf.quint8 |
|
tf.qint16 |
|
tf.quint16 |
|
tf.qint32 |
|
tf.resource |
handle to a mutable resource |
Constant OPs
tf.constant
1 | def constant( |
同值常量OPs
zeros:类似np中相应函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14# `np.zeros`
def tf.zeros(
shape,
dtype=tf.float32,
name=None
)
# `np.zores_like`
def tf.zeros_like(
input_tensor,
dtype=None,
name=None,
optimizeTrue
)- 若没有指明
dtype
,根据input_tensor
确定其中值- 对数值型为
0.0
- 对bool型为
False
- 对字符串为
b''
- 对数值型为
- 若没有指明
ones:类似np中相应函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# `np.ones`
def tf.ones(
shape,
dtype=tf.float32,
name=None
)
# `np.ones_like`
def tf.ones_like(
input_tensor,
dtype=None,
name=None,
optimize=True
)
- 若没有指明`dtype`,根据`input_tensor`确定
- 对数值型为`0.0`
- 对bool型为`True`
- 对字符串报错
fill:以
value
填充dims
给定形状1
2
3
4
5
6# `np.fill`
def tf.fill(
dims,
value,
name=None
)
列表常量OPs
- tensor列表不能直接
for
语句等迭代
tf.lin_space
:start
、stop
直接均分为num
部分1
2
3
4
5
6
7# `np.linspace`
def lin_space(
start,
stop,
num,
name=None
)tf.range
:start
、stop
间等间隔delta
取值1
2
3
4
5
6
7
8# `np.arange`
def tf.range(
start,
limit=None,
delta=1,
dtype=None,
name="range"
)
随机常量OPs
seed:设置随机数种子
1
2
3# np.random.seed
def tf.set_random_seed(seed):
passrandom:随机生成函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24def tf.random_normal()
def tf.truncated_normal(
?avg=0/int/(int),
stddev=1.0/float,
seed=None/int,
name=None
):
pass
def tf.random_uniform(
shape(1d-arr),
minval=0,
maxval=None,
dtype=tf.float32,
seed=None/int,
name=None/str
):
pass
def tf.random_crop()
def tf.multinomial()
def tf.random_gamma()shuffle
1
def tf.random_shuffle()
运算OPs
元素OPs
四则运算
1 |
|
逻辑运算
1 | def greater() |
数学函数
1 | def exp() |
列表运算OPs
1 | def tf.Concat() |
矩阵OPs
1 | def tf.MatMul() |
梯度OPs
1 | def tf.gradients( # 求`y`对`[xs]`个元素偏导 |
Variable
1 | class Variable: |
Variable
是包含很多方法的类- 其中方法OPs和一般的OP一样,也需要在Session中执行 才能生效
Variable
必须在会话中初始化后,才能使用- 会话维护自身独立
Variable
副本,不相互影响
Variable
和图分开存储,甚至是存储在独立参数服务器上- 存储大量数据也不会拖慢图载入速度
- 通常用于存储训练过程中weight、bias、维护图执行过程 中状态信息
constants是常数OPs
- 存储在图中:每次载入图会同时被载入,过大的constants 会使得载入图非常慢
- 所以最好只对原生类型使用constants
Variable创建
tf.get_variable
1 | def get_variable( |
- 此封装工厂方法相较于直接通过
tf.Variable
更好- 若变量已设置,可通过变量名获取变量,方便变量共享
- 可以提供更多的参数定制变量值
1 | # `tf.Variable`创建变量 |
Variable初始化
1 | with tf.Session() as sess: |
若某Variable依赖其他Variable,需要使用
initialized_value
指明依赖,确保依赖线性初始化1
2
3W = tr.Variable(tf.truncated_normal([700, 100])
# 指明依赖,保证依赖线性初始化
U = tf.Variable(W.initialized_value() * 2)