对于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)
作用:对于logits和labels之间计算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的纬度计算