TensorFlow常用函数介绍

对于TensorFlow中的基本用法,参考了网上很多博客,把自己认为解释的比较好的做一些整理。

tensorflow中tf.Variable()与tf.get_variable()两个函数的区别

一个变量通过调用run() 方法维持图的状态。你通过构造variable 类的实例来添加一个变量到图中。Variable() 构造器需要一个初始值,可以是任意类型和shape 的Tensor。初始值定义了变量的type和shape。构造完成之后,变量的type和shape 是固定的。可以使用assign 方法来修改变量的值。如果你想修改变量的shape,你必须使用assign 操作。并且validate_shpe=False。就像任何Tensor,通过Variable() 创建的variable,可以用作图中其他操作节点的输入。另外,所有操作承载的Tensor 类传递给variables

图一

首先解释一下个别参数的含义


initial_value:  一个Tensor,或者可以转化为Tensor的Python对象,其含义为:变量的初始值。初始值必须指定shape除非validate_shape 被设置为False;

trainable:  如果是True,变量也默认添加到GraphKeys.TRAINABLE_VARIABLES。这是很多优化器类使用的默认变量列表

collections:指定该图变量的类型、默认为[GraphKeys.GLOBAL_VARIABLES],为list类型

validate_shape:如果为False,则不进行类型和维度检查

name:变量的名称,如果没有指定则系统会自动分配一个唯一的值

具体区别:

1. tf.get_variable跟tf.Variable都可以用来定义图变量,但是前者的必需参数(即第一个参数)并不是图变量的初始值,而是图变量的名称。尽管上图显示每一个变量函数都有很多的参数,但是也只有第一个是必须填写的

2. 使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错


图二

        基于这两个函数的特性,当我们需要共享变量的时候,需要使用tf.get_variable()。在其他情况下,这两个的用法是一样的。他们之间的实质性区别就是:由于tf.Variable()每次都在创建新对象,所有reuse=True和它并没有什么关系。对于get_variable(),来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。

tf.variable_scope和tf.name_scope

        在图二中使用tf.get_variable()遇到相同名字的变量,就会报错。为什么提到这两个函数,这两个函数有什么作用?简单来说就是为变量添加命名域,一个深度学习模型的参数变量往往是成千上万的,不加上命名空间加以分组整理,将会成为可怕的灾难。TensorFlow的命名空间分为两种,tf.variable_scope和tf.name_scope。

        tf.variable_scope可以让变量有相同的命名,包括tf.get_variable得到的变量,还有tf.Variable的变量tf.name_scope可以让变量有相同的命名,只是限于tf.Variable的变量


图三


图四

换成下面的代码就可以执行了:


图五


神经网络组件:tf.nn

一.激活函数

常见的激活函数的模型可以参考这篇博客:常见激活函数总结

激活操作提供了在神经网络中使用的不同类型的非线性模型。包括光滑非线性模型(sigmoid, tanh, elu, softplus, and softsign)。连续但是不是处处可微的函数(relu, relu6, crelu and relu_x)。当然还有随机正则化 (dropout)所有的激活操作都是作用在每个元素上面的,输出一个tensor和输入的tensor又相同的形状和数据类型。这里列出tensorflow提供的这些激活函数,但是就不细讲原理了,参照链接就行.至于使用也是非常简单的.只以relu作为例子,其他的使用方式差不多.

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

参数:

features : tensor类型,必须是这些类型:A Tensor. float32, float64, int32, int64, uint8, int16, int8, uint16, half.

name: 操作名称(可选)

还有一些其他的激活函数为:


图六


二.分类

分类实现了一些交叉熵的函数等等,要是你的神经网络有分类的任务什么的化,一般可以用在输出层。Tensorflow的softmax_cross_entropy_with_logits函数TensorFlow四种Cross Entropy算法实现和应用

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

参数:

logits:非空的tensor,类型必须为half, float32, float64.

dim:softmax作用的维度,默认是-1,表示最后一个维度

name:【可选】这个操作的名字

返回值:

返回一个tensor,和logits有相同的类型和形状

2. tf.nn.log_softmax(logits, dim=-1, name=None)

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

作用:对于logitslabels之间计算softmax交叉熵。要是你对于softmax熟悉的话,这里很容易理解。通俗来说,就是在离散分类任务的时候度量概率误差的。softmax之后的每一个分量就代表一个类,分量(类)上面的值就是该类的概率。

这个函数并不是计算softmax的函数,只是根据softmax计算分类误差,所以不要吧这个函数当做softmax函数使用。logits和labels必须有相同的形状[batch_size, num_classes]相同的类型 (either float16, float32, or float64)

logits:Unscaled log probabilities.

labels:你的labels矩阵,每一行代表一个样本的概率分布(要是你熟悉softmax和onehot encoding的话)

dim:作用的维度,默认是-1,表示最后的那个维度

name:【可选】这个操作的名字

返回:一个1维的tensor,长度为batch_size,类型和logits一样。其中是各个元素相应样本的softmax的交叉熵损失。

4. tf.nn.weighted_cross_entropy_with_logits(logits, targets, pos_weight, name=None)

其他


tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

按概率来将x中的一些元素值置零,并将其他的值放大。用于进行dropout操作,一定程度上可以防止过拟合

x是一个张量,而keep_prob是一个(0,1]之间的值。x中的各个元素清零的概率互相独立,为1-keep_prob,而没有清零的元素,则会统一乘以1/keep_prob, 目的是为了保持x的整体期望值不变。


tf.fill(shape,value,name=None) :创建一个形状大小为shape的tensor,其初始值为value:


tf.constant(value,dtype=None,shape=None,name=’Const’)

创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list如果是一个数,那么这个常亮中所有值的按该数来赋值。如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。



tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

tf.random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)

这几个都是用于生成随机数tensor的。尺寸是shape

random_normal: 正太分布随机数,均值mean,标准差stddev

truncated_normal:截断正态分布随机数,均值mean,标准差stddev,不过只保留[mean-2*stddev,mean+2*stddev]范围内的随机数

random_uniform:均匀分布随机数,范围为[minval,maxval]。


tf.expand_dims(Tensor, dim):为张量+1维



tf.pack(values, axis=0, name=”pack”): 将一个R维张量列表沿着axis轴组合成一个R+1维的张量


tf.concat(concat_dim, values, name=”concat”): 将张量沿着指定维数拼接起来。


tf.sparse_to_dense:稀疏矩阵转密集矩阵


几个参数的含义:

sparse_indices: 元素的坐标[[0,0],[1,2]] 表示(0,0),和(1,2)处有值

output_shape: 得到的密集矩阵的shape

sparse_values: sparse_indices坐标表示的点的值,可以是0D或者1D张量。若0D,则所有稀疏值都一样。若是1D,则len(sparse_values)应该等于len(sparse_indices)

default_values: 缺省点的默认值


tf.random_shuffle(value,seed=None,name=None):沿着value的第一维进行随机重新排列



tf.argmax | tf.argmin

tf.argmax(input=tensor,dimention=axis):找到给定的张量tensor中在指定轴axis上的最大值/最小值的位置。



tf.equal(x, y, name=None): 判断两个tensor是否每个元素都相等。返回一个格式为bool的tensor


cast(x, dtype, name=None):将x的数据格式转化成dtype.例如,原来x的数据格式是bool,那么将其转化成float以后,就能够将其转化成0和1的序列。反之也可以


tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None):修正梯度值,用于控制梯度爆炸的问题。梯度爆炸和梯度弥散的原因一样,都是因为链式法则求导的关系,导致梯度的指数级衰减。为了避免梯度爆炸,需要对梯度进行修剪。

函数返回2个参数: list_clipped,修剪后的张量,以及global_norm,一个中间计算量。当然如果你之前已经计算出了global_norm值,你可以在use_norm选项直接指定global_norm的值。

TensorFlow中纬度的计算:参考文章:TensorFlow的纬度计算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. tf函数 tensorflow 封装的工具类函数 | 操作组 | 操作 ||:-------------| ...
    南墙已破阅读 5,238评论 0 5
  • 在一起也很久了,却发现我们越来越谋生,越来越不信任,是我多疑了,还是你真的没把我放在心里,可能正如你所说的,我们...
    Merciess阅读 561评论 0 1
  • 怎么才称得上是压缩PDF文件的“小能手”?首先得是一款能够专业编辑PDF文件的PDF阅读编辑器,其次需要有压缩功能...
    小皇可可阅读 546评论 0 0
  • 早在两千多年前的战国时代,著名思想家孟子就提倡"老吾老以及人之老,幼吾幼以及人之幼"的博爱思想。 博爱,就是...
    言行合一阅读 1,242评论 1 2