Active Function 激活函数

原创文章,请勿转载哦~!!

觉得有用的话,欢迎一起讨论相互学习~



  • Tensorflow提供了多种激活函数,在CNN中,人们主要是用tf.nn.relu,是因为它虽然会带来一些信息损失,但是性能较为突出.开始设计模型时,推荐使用tf.nn.relu,但高级用户也可创建自己的激活函数.评价某个激活函数是否有用时,需要考虑的因素有:
  1. 该函数应是单调的, 这样输出便会随着输入的增长而增长,从而使利用梯度下降法寻找局部极值点成为可能.

  2. 该函数应是可微分的,以保证该函数定义域内的任意一点上导数都存在,从而使得梯度下降法能够正常使用来自这类激活函数的输出.


tf.nn.relu

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

  • 解释:这个函数的作用是计算激活函数relu,即max(features, 0)。

    所有负数都会归一化为0,所以的正值保留为原值不变

  • 优点在于不收"梯度消失"的影响,且取值范围在[0,+oo]

  • 缺点在于使用了较大的学习速率时,易受达到饱和的神经元的影响

使用例子

import tensorflow as tf

a = tf.constant([-1.0, 2.0])
with tf.Session() as sess:
b = tf.nn.relu(a)
print(sess.run(b))
# [0. 2.]

输入参数:

● features: 一个Tensor。数据类型必须是:float32,float64,int32,int64,uint8,int16,int8。

● name: (可选)为这个操作取一个名字。

输出参数:

● 一个Tensor,数据类型和features相同。


tf.sigmoid

tf.sigmoid(x, name = None)

  • 解释:这个函数的作用是计算 x 的 sigmoid 函数。具体计算公式为 \(y = 1 / (1 + exp(-x))\)

  • 函数的返回值位于区间[0.0 , 1.0]中,当输入值较大时,tf.sigmoid将返回一个接近于1.0的值,而当输入值较小时,返回值将接近于0.0.

  • 优点在于对在真实输出位于[0.0,1.0]的样本上训练的神经网络,sigmoid函数可将输出保持在[0.0,1.0]内的能力非常有用.

  • 缺点在于当输出接近于饱和或者剧烈变化是,对输出返回的这种缩减会带来一些不利影响.

  • 当输入为0时,sigmoid函数的输出为0.5,即sigmoid函数值域的中间点

使用例子

import tensorflow as tf

a = tf.constant([[-1.0, -2.0], [1.0, 2.0], [0.0, 0.0]])
sess = tf.Session()
print(sess.run(tf.sigmoid(a))) # [[ 0.26894143 0.11920292]
# [ 0.7310586 0.88079703]
# [ 0.5 0.5 ]]

输入参数:

● x: 一个Tensor。数据类型必须是float,double,int32,complex64,int64或者qint32。

● name: (可选)为这个操作取一个名字。

输出参数:

● 一个Tensor,如果 x.dtype != qint32 ,那么返回的数据类型和x相同,否则返回的数据类型是 quint8


tf.tanh

tf.tanh(x, name = None)

  • 解释:这个函数的作用是计算 x 的 tanh 函数。具体计算公式为\(( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) )\)

  • tanh和tf.sigmoid非常接近,且与后者具有类似的优缺点,tf.sigmoid和tf.tanh的主要区别在于后者的值为[-1.0,1.0]

  • 优点在于在一些特定的网络架构中,能够输出负值的能力十分有用.

  • 缺点在于注意tf.tanh值域的中间点为0.0,当网络中的下一层期待输入为负值或者为0.0时,这将引发一系列问题.

使用例子

import tensorflow as tf

a = tf.constant([[-1.0, -2.0], [1.0, 2.0], [0.0, 0.0]])
sess = tf.Session()
print(sess.run(tf.tanh(a)))
# [[-0.76159418 -0.96402758]
# [ 0.76159418 0.96402758]
# [ 0. 0. ]]

输入参数:

● x: 一个Tensor。数据类型必须是float,double,int32,complex64,int64或者qint32。

● name: (可选)为这个操作取一个名字。

输出参数:

● 一个Tensor,如果 x.dtype != qint32 ,那么返回的数据类型和x相同,否则返回的数据类型是 quint8 .


tf.nn.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,要不都还是原来的值。一荣俱荣,一损俱损.

使用例子

import tensorflow as tf
# tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)
a = tf.constant([[-1.0, 2.0, 3.0, 4.0]])
with tf.Session() as sess:
b = tf.nn.dropout(a, 0.5, noise_shape=[1, 4]) # 第0维相互独立,第1维相互独立
print(sess.run(b))
b = tf.nn.dropout(a, 0.5, noise_shape=[1, 1]) # 第0维相互独立,第1维不是相互独立的
print(sess.run(b))
# 第一次
# [[-0. 4. 0. 0.]]
# [[-2. 4. 6. 8.]]
# 第二次
# [[-2. 0. 6. 8.]]
# [[-0. 0. 0. 0.]]

输入参数:

● x: 一个Tensor。

● keep_prob: 一个 Python 的 float 类型。表示元素是否放电的概率。

● noise_shape: 一个一维的Tensor,数据类型是int32。代表元素是否独立的标志。

● seed: 一个Python的整数类型。设置随机种子。

● name: (可选)为这个操作取一个名字。

输出参数:

● 一个Tensor,数据维度和x相同。

异常:

● 输入异常: 如果 keep_prob 不是在(0, 1]区间,那么会提示错误。

Tensorflow ActiveFunction激活函数解析的更多相关文章

  1. TensorFlow六种激活函数

    TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...

  2. tensorflow Relu激活函数

    1.Relu激活函数 Relu激活函数(The Rectified Linear Unit)表达式为:f(x)=max(0,x). 2.tensorflow实现 #!/usr/bin/env pyth ...

  3. Tensorflow之MNIST解析

    要说2017年什么技术最火爆,无疑是google领衔的深度学习开源框架Tensorflow.本文简述一下深度学习的入门例子MNIST. 深度学习简单介绍 首先要简单区别几个概念:人工智能,机器学习,深 ...

  4. 【TensorFlow】Python解析xml文件

    最近在项目中使用TensorFlow训练目标检测模型,在制作自己的数据集时使用了labelimg软件对图片进行标注,产生了VOC格式的数据,但标注生成的xml文件标签值难免会产生个别错误造成程序无法跑 ...

  5. tensorflow常用函数解析

    一.tf.transpose函数的用法 tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不 ...

  6. TensorFlow常用激活函数及其特点和用法(6种)详解

    http://c.biancheng.net/view/1911.html 每个神经元都必须有激活函数.它们为神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个 ...

  7. TensorFlow从0到1之TensorFlow常用激活函数(19)

    每个神经元都必须有激活函数.它们为神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.你可以把它看作输入和输出之间的转换.使用适当的激活函数,可以将输出 ...

  8. tensorflow源码解析之distributed_runtime

    本篇主要介绍TF的分布式运行时的基本概念.为了对TF的分布式运行机制有一个大致的了解,我们先结合/tensorflow/core/protobuf中的文件给出对TF分布式集群的初步理解,然后介绍/te ...

  9. tensorflow源码解析系列文章索引

    文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...

随机推荐

  1. RabbitMQ的基本使用到高级特性

    简介 继上一篇 CentOS上安装RabbitMQ讲述RabbitMQ具体安装后,这一篇讲述RabbitMQ在C#的使用,这里将从基本用法到高级特性的使用讲述. 前序条件 这里需要增加一个用户,并且设 ...

  2. [Link-Cut-Tree]【学习笔记】

    可以按照<Utopiosphere>的调唱出来 “Link-Cut ,Time doesn’t stop .Prepare your doubts ,Eat them up” 参考资料: ...

  3. 洛谷 P1967 货车运输

    洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...

  4. python对pywifi模块的认识

    pywifi是一个用来搞wifi的模块 下一章我们将用他破解wifi密码 pywifi安装 pip install pywifi 下列代码判断是否有无限网卡 import pywifi import ...

  5. See you~(二维树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1892 See you~ Time Limit: 5000/3000 MS (Java/Others)  ...

  6. 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)

    上一篇我们讲解了DispatcherServlet的url-pattern配置详解,今天我们来真正对SpringMVC进行配置式开发.所谓配置式开发是指“处理器类是程序员自己定义的.实现了特定接口的类 ...

  7. iOS扩展——Objective-C开发编程规范

    最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习.本文内容主要转载自:Objective-C-Codin ...

  8. javascript 之原型、原型链-14

    原型 原型是一个对象,每个函数对象(在javascript 之对象中说过函数也是对象 )都有一个属性(prototype)指向这个对象--原型对象,这个对象的作用是让所有对象实例共享原型对象中的属性. ...

  9. jquery1.8 在IE8 下面报错:对象不支持此属性或方法 return b.getAttribute("id")===a

    jquery1.8 在IE8 下面报错: 对象不支持此属性或方法 调试发现是下面这一行报错: 在IE8下面报错,在chrome和firefox都是好的. 实在找不到原因,最后把源码改成下面这样: 没有 ...

  10. 我在vs文本编辑中常用的快捷键----常更新

    1. Ctrl+向上键----文本向上滚动  Ctrl+向下键----文本向下滚动  Ctrl+Enter-----向下增加一行  Ctrl+Shift+Enter-------向上增加一行 2. 避 ...