2卷积神经网络相关API详解-2.3/2.4TensorFlow之激活函数API详解(上/下)

来源:互联网 发布:mysql数据库登陆 编辑:程序博客网 时间:2024/06/05 11:46

参考:
http://www.cnblogs.com/hellcat/p/7020135.html
http://www.studyai.com/

Activation Functions
the activation ops provide different types of nonlinearities for use in neural networks。
All activation ops apply componentwise,and produce a tensor of the same shape as the input tensor。

激活函数
在神经网络中,我们有很多的非线性函数来作为激活函数,比如连续的平滑非线性函数(sigmoid,tanh和softplus),连续但不平滑的非线性函数(relu,relu6和relu_x)和随机正则化函数(dropout)。
所有的激活函数都是单独应用在每个元素上面的,并且输出张量的维度和输入张量的维

分类:

  • 平滑非线性激活单元(sigmoid,tanh,elu,softplus,softsign)
  • 连续但不是处处可导(微)的激活单元(relu,relu6,crelu,relu_x)
  • 随机正则化激活单元(dropout)

这里写图片描述

这里写图片描述

relu:

tf.nn.relu(features, name = None)解释:这个函数的作用是计算激活函数relu,即max(features, 0)。输入参数:features: 一个Tensor。数据类型必须是:float32float64int32int64uint8int16int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同。

这里写图片描述


relu6:

tf.nn.relu6(features, name = None)解释:这个函数的作用是计算激活函数relu6,即min(max(features, 0), 6)。输入参数:features: 一个Tensor。数据类型必须是:floatdoubleint32int64uint8int16或者int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同。

这里写图片描述


crelu:

tf.nn.crelu(features, name = None)解释:这个函数会倍增通道,一个是relu,一个是relu关于y轴对称的形状。输入参数:features: 一个Tensor。数据类型必须是:float32float64int32int64uint8int16int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同,通道加倍。

elu:

tf.nn.elu(features, name = None)解释:x小于0时,y = a*(exp(x)-1),x大于0时同relu。features: 一个Tensor。数据类型必须是:float32float64int32int64uint8int16int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同。

这里写图片描述

see: Fast and Accurate Deep Network Learning by Exponential Linear Units(ELUs)


softplus:

tf.nn.softplus(features, name = None)解释:这个函数的作用是计算激活函数softplus,即log( exp( features ) + 1)。输入参数:features: 一个Tensor。数据类型必须是:float32float64int32int64uint8int16或者int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同。

这里写图片描述


softsign:

tf.nn.softsign(features, name = None)解释:这个函数的作用是计算激活函数softsign,即features / (abs(features) + 1)。输入参数:features: 一个Tensor。数据类型必须是:float32float64int32int64uint8int16或者int8。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和features相同。

这里写图片描述


sigmoid:

tf.sigmoid(x, name = None)解释:这个函数的作用是计算 x 的 sigmoid 函数。具体计算公式为 y = 1 / (1 + exp(-x))。输入参数:x: 一个Tensor。数据类型必须是floatdoubleint32,complex64,int64或者qint32。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,如果 x.dtype != qint32 ,那么返回的数据类型和x相同,否则返回的数据类型是 quint8 。

sigmoid输出恒大于零,相当于加了偏置分量。

这里写图片描述


tanh:

tf.tanh(x, name = None)解释:这个函数的作用是计算 x 的 tanh 函数。具体计算公式为 ( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) )。x: 一个Tensor。数据类型必须是floatdouble,int32,complex64,int64或者qint32。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,如果 x.dtype != qint32 ,那么返回的数据类型和x相同,否则返回的数据类型是 quint8 。

[-2,2]之间tanh最敏感

[-8,-2]之间tanh不敏感

这里写图片描述

这里写图片描述


dropout:

tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)解释:这个函数的作用是计算神经网络层的dropout。一个神经元将以概率keep_prob决定是否放电,如果不放电,那么该神经元的输出将是0,如果该神经元放电,那么该神经元的输出值将被放大到原来的1/keep_prob倍。这里的放大操作是为了保持神经元输出总个数不变。比如,神经元的值为[1, 2],keep_prob的值是0.5,并且是第一个神经元是放电的,第二个神经元不放电,那么神经元输出的结果是[2, 0],也就是相当于,第一个神经元被当做了1/keep_prob个输出,即2个。这样保证了总和2个神经元保持不变。默认情况下,每个神经元是否放电是相互独立的。但是,如果noise_shape被修改了,那么他对于变量x就是一个广播形式,而且当且仅当 noise_shape[i] == shape(x)[i] ,x中的元素是相互独立的。比如,如果 shape(x) = [k, l, m, n], noise_shape = [k, 1, 1, n] ,那么每个批和通道都是相互独立的,但是每行和每列的数据都是关联的,即要不都为0,要不都还是原来的值。输入参数:x: 一个Tensor。keep_prob: 一个 Python 的 float 类型。表示元素是否放电的概率。noise_shape: 一个一维的Tensor,数据类型是int32。代表元素是否独立的标志。seed: 一个Python的整数类型。设置随机种子。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据维度和x相同。异常:输入异常: 如果 keep_prob 不是在 (0, 1]区间,那么会提示错误。

bias_add:

tf.nn.bias_add(value, bias, name = None)解释:这个函数的作用是将偏差项 bias 加到 value 上面。这个操作你可以看做是 tf.add 的一个特例,其中 bias 必须是一维的。该API支持广播形式,因此 value 可以有任何维度。但是,该API又不像 tf.add 可以让 bias 的维度和 value 的最后一维不同,tf.nn.bias_add中bias的维度和value最后一维必须相同。输入参数:value: 一个Tensor。数据类型必须是float,double,int64int32,uint8,int16,int8或者complex64。bias: 一个一维的Tensor,数据维度和 value 的最后一维相同。数据类型必须和value相同。name: (可选)为这个操作取一个名字。输出参数:一个Tensor,数据类型和value相同。

范例:

#!/usr/bin/env python# -*- coding: utf-8 -*-import tensorflow as tfa = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]])b = tf.constant([2.0,1.0]) c = tf.constant([1.0])sess = tf.Session()print sess.run(tf.nn.bias_add(a, b))# 因为 a 最后一维的维度是 2 ,但是 c 的维度是 1,所以以下语句将发生错误print sess.run(tf.nn.bias_add(a, c))# 但是 tf.add() 可以正确运行print sess.run(tf.add(a, c))

这里写图片描述