TensorFlow函数、概念总结

本文是笔者在学习《TensorFlow:实战Google深度学习框架》(第二版)时,对TensorFlow函数、概念的一些总结。搜集过程中大量参考了TensorFlow官方API文档,同时也借鉴了一些其它博客。本文正在持续更新中。

文章目录

TensorFlow语法和函数

tf.add_to_collecton(name, value)

将资源加入集合(collection)中,name是集合名,value是要加入集合的变量

tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)

该函数可以将一个张量中的数值限制在一个范围内,可以避免一些运算错误。
t,需要被限制数值范围的张量。
clip_value_min,一个0维张量,或是一个和t有同样维度的张量,限制了张量t取值的最小值。
clip_value_max,一个0维张量,或是一个和t有同样维度的张量,限制了张量t取值的最大值。

tf.contrib.layers.l1_regularizer(scale, scope=None)

该函数返回一个函数,返回函数可以用来计算权重的L1正则化项的值。
scale,一个乘数因子张量(标量),如果是0的话会使正则化失效。这个乘数因子通常称为lambda,表示了正则化项的权重。在L1正则化中,有公式: R ( w ) = w 1 = i w i R(w) = ||w||_1=\sum_i|w_i|
同时,损失函数将由如下公式表示: l o s s = J ( θ ) + λ R ( w ) loss = J(θ)+λR(w)

tf.contrib.layers.l2_regularizer(scale, scope=None)

该函数返回一个函数,返回函数可以用来计算权重的L2正则化项的值。
scale,一个乘数因子张量(标量),如果是0的话会使正则化失效。这个乘数因子通常称为lambda,表示了正则化项的权重。在L2正则化中,有公式: R ( w ) = w 2 2 = i w i 2 R(w) = ||w||_2^2=\sum_i|w_i^2|
同时,损失函数将由如下公式表示: l o s s = J ( θ ) + λ R ( w ) loss = J(θ)+λR(w)

tf.get_collection(key, scope=None)

获取一个集合中的所有资源。key是集合名,scope是可选项。如果提供了scope,那么返回的结果list仅包含那些名称符合re.match正则表达式的资源。该函数返回一个列表(list),其中包含了带名字的变量,变量的顺序取决于它们被加入集合时的顺序。

tf.get_default_graph()

获取当前默认的计算图。对于一个张量a,a.graph可以获取张量a所属的计算图。

tf.global_variables_initializer()

Variable有关。该函数是最常见的初始化变量方式。该函数可以初始化计算图中所有的变量。

# Add an Op to initialize global variables.
init_op = tf.global_variables_initializer()

# Launch the graph in a session.
with tf.Session() as sess:
    # Run the Op that initializes global variables.
    sess.run(init_op)
    # ...you can now run any Op that uses variable values...

tf.Graph()

实例化类。生成新的计算图。不同计算图上的张量和运算不会共享。图上内容包括tf.Operationtf.Tensor类,这里操作是图上的节点,而张量是有向边。

tf.Graph().as_default()

将图设置为TensorFlow运行环境的默认计算图。若g是一个tf.Graph类,那么g.as_default() 就是将图g作为默认计算图。

tf.Graph().device()

指定实例化图的计算设备。通常用字符串来指定执行设备。设备有CPU和GPU,指定的方法分别为g.device(’/gpu:0’)g.device(’/cpu:0’)。数字指定了设备的序号,如果有2个GPU,可以指定 ‘/gpu:0’‘/gpu:1’ 来明确指定是哪个GPU负责计算。

tf.greater(x, y, name=None)

别名:tf.math.greater。
比较两个张量x和y中每一个元素的大小,并返回比较结果。当输入张量维度不一样时,会进行类似NumPy广播操作(broadcasting)的处理。该函数返回一个bool型的张量。

tf.matmul(a, b)

别名:tf.linalg.matmul。
该函数实现矩阵乘法的功能。通常只有两个参数,两个参数是两个可以相乘的矩阵,返回结果a*b。

tf.nn.relu(features, name=None)

参数features是一个张量,其类型必须为以下之一:float32, float64, int32, uint8, int16, int64, bfloat16, uint16, half, uint32, uint64, qint8。
该函数计算了features和0的最大值,并把较大者作为和features同类型的向量返回。

tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None, dim=-1, name=None)

该函数计算了使用了Softmax回归后的,labels和logits之间的交叉熵。
labels,实际的标签,其维度应该是[batch_size, num_classes],batch_size是样本数量,num_classes是种类数量。labels[i]的每一列应该是合法的概率分布。
logits,网络的输出,维度要求同labels。
该函数返回值,是一个包含着softmax回归的交叉熵的张量。 它的类型和logits是一样的,而它的维度和labels相比,只缺少labels的最后一个维度。
通常,在该函数处理得出交叉熵张量后,用tf.reduce_mean来计算交叉熵平均值,以供实际使用。

tf.square(x, name=None)

该函数计算了x的平方。有y = x 2 x^2
x应该是一个张量或SparseTensor,其类型必须为以下之一:half, float32, float64, int32, int64, complex64, complex128。
返回值是一个张量或SparseTensor,其类型和x相同。

tf.placeholder(dtype, shape(optional), name(optional))

TensorFlow中placeholder机制用于提供输入数据。placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。在placeholder定义时,这个位置上的数据类型是需要指定的。和张量一样,这个类型是不可以改变的。维度和名字都是可选的参数。placeholder必须用feed_dict在运行前赋值,否则会报错。

x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)

with tf.Session() as sess:
  print(sess.run(y))  # ERROR: will fail because x was not fed.

  rand_array = np.random.rand(1024, 1024)
  print(sess.run(y, feed_dict={x: rand_array}))  # Will succeed.

tf.reduce_mean(input_tensor, axis=None, keepdims=None, name=None)

别名:tf.math.reduce_mean。
该函数可以跨维度地计算一个张量的平均值,取平均的过程是降维的。
input_tensor,要降维的张量,应该是一个数值类型。
axis,要降维的维度。如果axis=None(默认值),那么就对所有维度降维取平均。若输入张量的axis的维度为rank,那么axis取值必须在区间 [-rank, rank] 上。
keepdims,如果为True,那么就保持被降维的那个维度为1。

import tensorflow as tf
x = tf.constant([[1., 1.], [2., 2.]])
a = tf.reduce_mean(x)  # 1.5
b = tf.reduce_mean(x, 0)  # [1.5, 1.5]
c = tf.reduce_mean(x, 1)  # [1.,  2.]
d = tf.reduce_mean(x, 1, keepdims=True) #[[1.], [2.]]

Session

一个用来运行TensorFlow中计算操作的Session对象封装了操作对象被执行和张量对象被计算的环境。

Session.close()

关闭这个对话,同时释放该会话管理的所有资源。

Session.run(fetches, feed_dict=None, options=None, run_metadata=None)

该函数运行在fetches中的所有操作和张量求值,并用feed_dict中的字典映射来对输入变量赋值。

tf.sigmoid(x, name=None)

几个别名:tf.math.sigmoid, tf.nn.sigmoid。
sigmoid函数有如下函数形式:y = 1 1 + e x \frac{1}{1+e^{-x}}
参数x是一个张量,其类型有如下形式:float16, float32, float64, complex64, complex128。
函数返回值是一个和x有同样类型的张量。

tf.tanh(x, name=None)

几个别名:tf.math.tanh, tf.nn.tanh。
计算x的双曲正切值,通常双曲正切值有如下公式:y = e x e x e x + e x \frac{e^x-e^{-x}}{e^x+e^{-x}}
参数x是一个张量或SparseTensor,其类型为以下之一:float16, float32, double, complex64, complex128。
函数返回值也是一个和x有同样类型的张量或SparseTensor。

tf.Tensor

实例化类。张量是计算图中操作(operation)的输出。

tf.Tensor.get_shape()

得到某一实例化张量的维度(shape)信息。

tf.train

模块。其中包含了一些类和函数。常见的有一些优化算法,这些都是

tf.train.AdamOptimizer

。Adam优化算法。

tf.train.AdamOptimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocat_gradients_with_ops=False, name=None, grad_loss=None)

loss,损失函数,是一个张量。
global_step,训练轮数,可选参数。
var_list,在减小损失函数时要更新的变量列表或元组(tuple),默认值是GraphKeys.TRAINABLE_VARIABLES的变量列表,可选参数。

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staricase=False, name=None)

该函数用于生成指数衰减学习率。用指数衰减法来减小学习率有如下公式: d e c a y e d _ l e a r n i n g _ r a t e = l e a r n i n g _ r a t e × d e c a y _ r a t e g l o b a l _ s t e p ÷ d e c a y _ s t e p s decayed\_learning\_rate = learning\_rate \times decay\_rate^{global\_step \div decay\_steps}
其中,decayed_learning_rate为每一轮优化时使用的学习率。
learning_rate,为实现设定好的初始学习率。
global_step,为迭代轮数。
decay_rate,为衰减系数,衰减率。
decay_steps,为衰减速度,通常代表了完整使用一遍训练数据所需要的迭代轮数。这个迭代轮数也就是总训练样本除以每一个batch中的训练样本数。
staircase,默认值为False,这是学习率随迭代轮数(global_step)的变化而连续变化。当staircase为True时,global_step / decay_steps会被转化为整数,这使得学习率成为一个阶梯函数,而非连续的。

tf.train.ExponentialMovingAverage

。滑动平均模型。在实例化一个滑动平均模型对象时,需要指定一个衰减率(decay),这个衰减率用于控制模型更新的速度。ExponentialMovingAverage对每一个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,每次运行变量更新时,影子变量的值会更新为 s h a d o w _ v a r i a b l e = d e c a y × s h a d o w _ v a r i a b l e + ( 1 d e c a y ) × v a r i a b l e shadow\_variable = decay \times shadow\_variable + (1-decay) \times variable
其中shadow_variable为影子变量,variable为待更新的变量,decay为衰减率。从公式中可以看到,decay决定了模型更新的速度,decay越大模型越趋于稳定。在实际应用中,的decay一般会设成非常接近1的数(比如0.999或0.9999)。为了使模型在训练前期可以更新得更快,ExponentialMovingAverage还提供了num_updates参数来动态设置decay的大小。如果在ExponentialMovingAverage初始化时提供了num_updates参数,那么每次使用的衰减率将是
m i n { d e c a y , 1 + n u m _ u p d a t e s 10 + n u m u p d a t e s } min\{decay, \frac{1+num\_updates}{10+num_updates}\}

tf.train.ExponentialMovingAverage.apply(var_list=None)

该函数维护了变量的滑动平均值。var_list必须是Variable或者张量对象的列表。该函数对var_list中的所有元素都创建了影子变量,影子变量的初值也就是变量的初值,这些影子变量会被添加到GraphKeys.MOVING_AVERAGE_VARIABLES集合中。影子变量在创建时,也被添加到了GraphKeys.ALL_VARIABLES集合中,这里影子变量是不可训练的trainable=False。
该方法返回一个操作(Operation),用来更新和var_list中变量有关的所有影子变量的值。

tf.train.ExponentialMovingAverage.average(var)

该函数返回var的滑动平均。average_name方法会返回var的名字。

tf.train.GradientDescentOptimizer

。梯度下降优化算法。

tf.train.GradientDescentOptimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocat_gradients_with_ops=False, name=None, grad_loss=None)

loss,损失函数,是一个张量。
global_step,训练轮数,可选参数。
var_list,在减小损失函数时要更新的变量列表或元组(tuple),默认值是GraphKeys.TRAINABLE_VARIABLES的变量列表,可选参数。

tf.train.MomentumOptimizer

。动量梯度下降优化算法。

tf.train.MomentumOptimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocat_gradients_with_ops=False, name=None, grad_loss=None)

loss,损失函数,是一个张量。
global_step,训练轮数,可选参数。
var_list,在减小损失函数时要更新的变量列表或元组(tuple),默认值是GraphKeys.TRAINABLE_VARIABLES的变量列表,可选参数。

tf.Variable

实例化类。 向计算图中添加变量可以通过实例化Variable类。构造一个Variable实例需要一个变量初始值,这个初始值可以是一个任意类型任意维度的张量。初始值定义了这个变量的类型和维度。一个变量在构建之后,它的类型就不能再改变了。如果需要在创建之后改变它的维度,需要在实例化时值定参数validate_shape = False

属性(properties)

device。该变量的运行设备。
dtype。该变量的类型。
graph。该变量的计算图。
initial_value。返回变量的初始值(张量)。
initializer。当开始运行计算图中关于变量的操作之前,所有的变量必须被显式地初始化。该函数用于对一个变量实例进行显式的初始化。

# w is a variable instance.
# Launch the graph in a session.
with tf.Session() as sess:
    # Run the variable initializer.
    sess.run(w.initializer)
    # ...you now can run ops that use the value of 'w'...

name。该变量的名字。
op。产生该变量作为输出的那个操作。
shape。该变量的维度。

tf.Variable.get_shape()

效果同tf.Variable.shape属性。得到变量的维度。

tf.Variable.initialized_value()

返回一个已初始化的变量值。在通过其他变量的初始值来初始化新的变量时,应该用该函数来获取那个已初始化的变量值,而不是直接引用那个变量。

tf.Variable.set_shape(shape)

重新指定一个变量的维度。

tf.where(condition, x=None, y=None, name=None)

该函数根据判断条件condition,返回x或y。
如果x和y都是None,该函数返回一个condition张量中真值的索引张量。返回张量是二维的,第一维(行)表示真值个数,第二维(列)表示真值的索引。
如果x和y都不是None,那么x和y必须有同样的维度。如果x和y都是标量,那么condition必须也是标量。如果x和y是高维度的向量,那么condition的维度必须要么和x的第一维度的大小相匹配,要么和x相同。
根据condition来选取x和y,是元素级的。按输出的每一行(第一维度),如果condition的该分量是真,那么就输出x的对应分量,否则是假,输出y的对应分量。

TensorFlow中维护的集合列表

集合名称 集合内容 使用场景
tf.GraphKeys.VARIABLES 所有变量 持久化TensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES 可学习的变量(一般指神经网络中的参数) 模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES 日志生成相关的张量 TensorFlow计算可视化
tf.GraphKeys.QUEUE_RUNNERS 处理输入的QueueRunner 输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES 所有计算了滑动平均值的变量 计算变量的滑动平均值

TensorFlow随机数生成函数

函数名称 随机数分布 主要参数
tf.random_normal 正态分布 平均值mean、标准差stddev、随机种子seed、取值类型dtype
tf.truncated_normal 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值mean、标准差stddev、随机种子seed、取值类型dtype
tf.random_uniform 均匀分布 最小取值minval、最大取值maxval、随机种子seed、取值类型dtype
tf.random_gamma Gamma分布 形状参数alpha、尺度参数beta、取值类型dtype、随机种子seed等

TensorFlow常用生成函数

函数名称 功能 样例
tf.zeors 产生全0的数组 tf.zeors([2,3],int32)->[[0,0,0], [0,0,0]]
tf.ones 产生全1的数组 tf.ones([2,3],int32)->[[1,1,1], [1,1,1]]
tf.fill 产生一个全部为给定数字的数组 tf.fill([2,3],9)->[[9,9,9], [9,9,9]]
tf.constant 产生一个给定值的常量 tf.constant([1,2,3])->[1,2,3]

TensorFlow概念

计算图

TensorFlow中最重要的两个概念,顾名思义,是tensor(张量)flow(流)。张量可以理解为多维向量,而流就是一张向量流图,也就可以理解为计算图,用来表现模型的计算过程。

TensorFlow程序一般分为两个阶段,首先要在计算图中定义所有的计算,然后再去执行这些计算,得到的输出就是我们想要的结果。

张量

在TensorFlow程序中,所有的数据是通过张量来表现的。张量是一个广义的概念,是多维向量。狭义的理解,0阶张量就是标量(scalar),一阶张量是一维数组,二维张量是二维矩阵,多维的向量就叫张量了。张量主要有三个属性:名字(name)、维度(shape)和类型(type)。

名字(name)

名字是一个张量的唯一标识符,同时也给出了这个张量是如何计算出来的。张量的命名形式基本如同 “node:src_output” 这样,其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。

维度(shape)

维度属性描述了一个张量的维度信息。shape=(m1,m2,…,mn),对于这句的理解,是该张量的维度为m1 x m2 x … x mn的张量,若mi为空,那就意味这这里没有维度,举个例子,shape=(2,1)和shape=(2,)是不一样的,前者是2x1矩阵,后者是长度为2的数组。若mi为None,那么意味着此处的维度是任意的,这个实例在构建神经网络时的placeholder等地方会用到。

类型(type)

每个张量会有一个唯一的类型。TensorFlow运算中,所有参与运算的张量的类型要匹配,否则会报错。如果不指定类型,TensorFlow会给出默认类型,比如不带小数点的会默认为int32,带小数点的会默认为float32。建议指定dtype来明确变量的数据类型。TensorFlow支持14种不同类型,实数的tf.float32, tf.float64, 整数的tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8, 布尔型tf.bool, 复数型tf.complex64, tf.complex128.

会话

TensorFlow中的运算的执行是在**会话(session)**中真正发生的。会话拥有并管理TensorFlow程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能初夏资源泄露的问题。

sess = tf.Session()	# 创建一个会话
sess.run()	# 利用会话来真正执行运算
sess.close()	# 关闭会话

关闭会话是必要的。因为在这种调用会话的模式中,只有调用Session.close()时,会话管理的资源才被释放。如果在会话执行期间发生异常而退出程序了,那么会话管理的资源将不会因为调用Session.close()而释放,这样会导致一些问题,甚至是资源泄露。

with tf.Session() as sess:
	sess.run()

利用Python上下文管理器来运行会话是一种比较好的习惯。在上下文管理器退出时,会自动释放掉所有资源,不必担心Session.close()的调用问题。

猜你喜欢

转载自blog.csdn.net/qq_41662115/article/details/86488719