0%

tensorflow

placeholder

函数形式:image-20211005211038432

参数:

dtype:数据类型。常用的是tf.float32,tf.float64等数值类型

shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)

name:名称

使用原因: Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

​ 所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。

get_variable

该函数共有十一个参数,常用的有:名称name、变量规格shape、变量类型dtype、变量初始化方式initializer、所属于的集合collections。

该函数的作用是创建新的tensorflow变量,常见的initializer有:常量初始化器tf.constant_initializer、正太分布初始化器tf.random_normal_initializer、截断正态分布初始化器tf.truncated_normal_initializer、均匀分布初始化器tf.random_uniform_initializer。

张量

关于张量的学习,可参考:

什么是张量? - 知乎 (zhihu.com)

convert_to_tensor

将给定值转换为张量。

1
2
3
4
5
6
tf.convert_to_tensor(
value,
dtype=None,
dtype_hint=None,
name=None
)

该函数将各种类型的Python对象转换为张量对象。它接受张量对象、数字数组、Python列表和Python标量。

参数:

value:类型具有注册张量转换函数的对象。
dtype:返回张量的可选元素类型。如果缺少,则从值的类型推断类型。
dtype_hint:返回张量的可选元素类型,当dtype为None时使用。在某些情况下,调用者在转换为张量时可能没有考虑到dtype,因此dtype_hint可以用作软首选项。如果不能转换为dtype_hint,则此参数没有效果。
name:创建新张量时使用的可选名称。

返回值:

一个基于值的张量。

embedding_lookup()

用途主要是选取一个张量里面索引对应的元素。

tf.nn.embedding_lookup() 详解 - 简书 (jianshu.com)

expand_dims()

tf.expand_dims()函数用于给函数增加维度。

1
2
3
4
5
6
tf.expand_dims(
input,
axis=None,
name=None,
dim=None
)
参数:
  • input是输入张量。
  • axis是指定扩大输入张量形状的维度索引值。
  • dim等同于轴,一般不推荐使用。

函数的功能是在给定一个input时,在axis轴处给input增加一个维度。

(5条消息) tf.expanddims()函数解析(最清晰的解释)种树最好的时间是10年前,其次是现在!!!-CSDN博客_tf.expand_dim

tf.tile()

tensorflow中的tile()函数是用来对张量(Tensor)进行扩展的,其特点是对当前张量内的数据进行一定规则的复制。最终的输出张量维度不变。

1
2
3
4
5
tf.tile(
input,
multiples,
name=None
)

input是待扩展的张量,multiples是扩展方法。
假如input是一个3维的张量。那么mutiples就必须是一个1x3的1维张量。这个张量的三个值依次表示input的第1,第2,第3维数据扩展几倍。

tf.tile()函数理解 - chamie - 博客园 (cnblogs.com)

concact

tensorflow中用来拼接张量的函数tf.concat(),用法:

1
tf.concat([tensor1, tensor2, tensor3,...], axis)

axis=0 代表在第0个维度拼接

axis=1 代表在第1个维度拼接

对于一个二维矩阵,第0个维度代表最外层方括号所框下的子集,第1个维度代表内部方括号所框下的子集。维度越高,括号越小。

tf.layers.batch_normalization

用来构建待训练的神经网络模型,方法接口如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
tf.layers.batch_normalization(
inputs,
axis=-1,
momentum=0.99,
epsilon=0.001,
center=True,
scale=True,
beta_initializer=tf.zeros_initializer(),
gamma_initializer=tf.ones_initializer(),
moving_mean_initializer=tf.zeros_initializer(),
moving_variance_initializer=tf.ones_initializer(),
beta_regularizer=None,
gamma_regularizer=None,
beta_constraint=None,
gamma_constraint=None,
training=False,
trainable=True,
name=None,
reuse=None,
renorm=False,
renorm_clipping=None,
renorm_momentum=0.99,
fused=None,
virtual_batch_size=None,
adjustment=None
)

这里有几个重要参数需要注意:

  • axis的值取决于按照input的哪一个维度进行BN,例如输入为channel_last format,即[batch_size, height, width, channel],则axis应该设定为4,如果为channel_first format,则axis应该设定为1.
  • momentum的值用在训练时,滑动平均的方式计算滑动平均值moving_mean和滑动方差moving_variance
  • centerTrue时,添加位移因子beta到该BN层,否则不添加。添加beta是对BN层的变换加入位移操作。注意,beta一般设定为可训练参数,即trainable=True
  • scaleTrue是,添加缩放因子gamma到该BN层,否则不添加。添加gamma是对BN层的变化加入缩放操作。注意,gamma一般设定为可训练参数,即trainable=True
  • training表示模型当前的模式,如果为True,则模型在训练模式,否则为推理模式。要非常注意这个模式的设定,这个参数默认值为False。如果在训练时采用了默认值False,则滑动均值moving_mean和滑动方差moving_variance都不会根据当前batch的数据更新,这就意味着在推理模式下,均值和方差都是其初始值,因为这两个值并没有在训练迭代过程中滑动更新。
  • tf.layers.batch_normalization 介绍 - 大雄fcl - 博客园 (cnblogs.com)

dense

dense,即全连接网络,layers 模块提供了一个 dense() 方法来实现此操作,定义在 tensorflow/python/layers/core.py 中,下面我们来说明一下它的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dense(
inputs,
units,
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)

参数说明如下:
inputs:必需,即需要进行操作的输入数据。
units:必须,即神经元的数量。
activation:可选,默认为 None,如果为 None 则是线性激活。
use_bias:可选,默认为 True,是否使用偏置。
kernel_initializer:可选,默认为 None,即权重的初始化方法,如果为 None,则使用默认的 Xavier 初始化方法。
bias_initializer:可选,默认为零值初始化,即偏置的初始化方法。
kernel_regularizer:可选,默认为 None,施加在权重上的正则项。
bias_regularizer:可选,默认为 None,施加在偏置上的正则项。
activity_regularizer:可选,默认为 None,施加在输出上的正则项。
kernel_constraint,可选,默认为 None,施加在权重上的约束项。
bias_constraint,可选,默认为 None,施加在偏置上的约束项。
trainable:可选,默认为 True,布尔类型,如果为 True,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES 中。
name:可选,默认为 None,卷积层的名称。
reuse:可选,默认为 None,布尔类型,如果为 True,那么如果 name 相同时,会重复利用。
返回值: 全连接网络处理后的 Tensor。

reshape()

tf.reshape(tensor, shape, name=None)
函数的作用是将tensor变换为参数shape的形式。 其中shape为一个列表形式,特殊的一点是列表中可以存在-1。

转换为一般的shape(也就是不涉及-1的)我这里就不说了,主要说一下对-1的理解。
-1代表的含义是不用我们自己指定这一维的大小,函数会自动计算,但列表中只能存在一个-1。
(当然如果存在多个-1,就是一个存在多解的方程了)

我理解的要点是:首先shape就是reshape变换后的矩阵大小,先不管-1的那一个维度,先看其它维度,然后用原矩阵的总元素个数除以确定的维度,就能得到-1维度的值。

我们来看例子。

M=np.array([[[[1,2,3]]],[[[4,5,6]]],[[[7,8,9]]]]) #M是[3,1,1,3]的四维矩阵

我想把M重组成若干个3维的向量,那么直接tf.reshape(M,[-1,3])

那么会得到几个3维向量呢? M一共有9个元素,9/3=3,那么得到3个三维向量,那么结果就是[3,3]的矩阵。

image-20211006175936881

那么我想得到若干个[3,3]的矩阵,那么我们tf.reshape(M,[-1,3,3])

那么结果就是[1,3,3]的矩阵

image-20211006175946915

tf.reduce_mean

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

1
2
3
4
5
reduce_mean(input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None)

第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
第四个参数name: 操作的名称;
第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;

tf.nn.sigmoid_cross_entropy_with_logits

tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None)

对于给定的logits计算sigmoid的交叉熵。

tf.trainable_variables()

顾名思义,这个函数可以也仅可以查看可训练的变量,在我们生成变量时,无论是使用tf.Variable()还是tf.get_variable()生成变量,都会涉及一个参数trainable,其默认为True。以tf.Variable()为例:

1
2
3
4
5
6
7
__init__(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
...
)

对于一些我们不需要训练的变量,比较典型的例如学习率或者计步器这些变量,我们都需要将trainable设置为False,这时tf.trainable_variables() 就不会打印这些变量。

tf.train.GradientDescentOptimizer

TensorFlow中损失优化方法

  • tf.train.GradientDescentOptimizer(learningrate, uselocking, name):原始梯度下降方法,唯一参数就是学习率。

tf.gradients()

参数如下:

1
2
3
4
5
6
7
8
tf.gradients(ys, xs, 
grad_ys=None,
name='gradients',
colocate_gradients_with_ops=False,
gate_gradients=False,
aggregation_method=None,
stop_gradients=None)

tf.gradients()实现ysxs求导,接受求导值ysxs不仅可以是tensor,还可以是list

tf.clip_by_global_norm

tf.clip_by_global_norm函数的作用就是通过权重梯度的总和的比率来截取多个张量的值。

tf.gather

tf.gather(params,indices,axis=0 )

从params的axis维根据indices的参数值获取切片