placeholder
函数形式:
参数:
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。
张量
关于张量的学习,可参考:
convert_to_tensor
将给定值转换为张量。
1 | tf.convert_to_tensor( |
该函数将各种类型的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 | tf.expand_dims( |
参数:
- input是输入张量。
- axis是指定扩大输入张量形状的维度索引值。
- dim等同于轴,一般不推荐使用。
函数的功能是在给定一个input时,在axis轴处给input增加一个维度。
(5条消息) tf.expanddims()函数解析(最清晰的解释)种树最好的时间是10年前,其次是现在!!!-CSDN博客_tf.expand_dim
tf.tile()
tensorflow中的tile()函数是用来对张量(Tensor)进行扩展的,其特点是对当前张量内的数据进行一定规则的复制。最终的输出张量维度不变。
1 | tf.tile( |
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 | tf.layers.batch_normalization( |
这里有几个重要参数需要注意:
axis
的值取决于按照input
的哪一个维度进行BN,例如输入为channel_last
format,即[batch_size, height, width, channel]
,则axis
应该设定为4,如果为channel_first
format,则axis
应该设定为1.momentum
的值用在训练时,滑动平均的方式计算滑动平均值moving_mean
和滑动方差moving_variance
。center
为True
时,添加位移因子beta
到该BN层,否则不添加。添加beta
是对BN层的变换加入位移操作。注意,beta
一般设定为可训练参数,即trainable=True
。scale
为True
是,添加缩放因子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 | dense( |
参数说明如下:
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]的矩阵。
那么我想得到若干个[3,3]的矩阵,那么我们tf.reshape(M,[-1,3,3])
那么结果就是[1,3,3]的矩阵
tf.reduce_mean
tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
1 | reduce_mean(input_tensor, |
第一个参数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 | __init__( |
对于一些我们不需要训练的变量,比较典型的例如学习率或者计步器这些变量,我们都需要将trainable设置为False,这时tf.trainable_variables() 就不会打印这些变量。
tf.train.GradientDescentOptimizer
TensorFlow中损失优化方法
- tf.train.GradientDescentOptimizer(learningrate, uselocking, name):原始梯度下降方法,唯一参数就是学习率。
tf.gradients()
参数如下:
1 | tf.gradients(ys, xs, |
tf.gradients()
实现ys
对xs
求导,接受求导值ys
和xs
不仅可以是tensor,还可以是list
tf.clip_by_global_norm
tf.clip_by_global_norm函数的作用就是通过权重梯度的总和的比率来截取多个张量的值。
tf.gather
tf.gather(params,indices,axis=0 )
从params的axis维根据indices的参数值获取切片