relu

激活函数篇(Sigmoid、tanh、ReLU、PReLU)

ⅰ亾dé卋堺 提交于 2020-02-04 01:50:58
写在前面:此文只记录了下本人感觉需要注意的地方,不全且不一定准确。详细内容可以参考文中帖的链接,比较好!!! 常用激活函数(激励函数)理解与总结 激活函数的区别与优点 梯度消失与爆炸 1. 激活函数是什么? 在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。 2. 激活函数的用途 如果不用激活函数,每一层的输入都是上一层输出的线性函数,而多层线性函数与一层线性函数的功能是等价的,网络的逼近能力就相当有限,因此引入非线性函数作为激励函数,使得深层神经网络的可以更好的逼近任意函数。 3. 常见的激活函数: Sigmoid 函数: 表达形式: f ( z ) = 1 1 + e − z f(z) = \frac{1}{1+e^{-z}} f ( z ) = 1 + e − z 1 ​ 函数图像: 导数图像: 优缺点: 优点 能够把输入的连续值压缩到【0~1】之间,可解释性强,0为不活跃,1为活跃 缺点 梯度反向传递时,容易导致梯度的爆炸和消失(大概率梯度消失,有时梯度爆炸)。 而由于 σ ( z ) \sigma (z) σ ( z ) 最大值为0.25,且通常初始| w | < 1 ,则有: 极易出现梯度消失;当初始化 |w| > 4 时,w * σ ( z ) \sigma (z) σ ( z ) > 1 ,才会产生梯度爆炸。

CNN网络的基本介绍(二)

强颜欢笑 提交于 2020-02-02 20:22:02
四、激活函数 激活函数又称 非线性映射 ,顾名思义,激活函数的引入是 为了增加整个网络的表达能力(即非线性) 。若干线性操作层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数。常用的函数有sigmoid、双曲正切、线性修正单元函数等等。 使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。   比如,在神经网路的前向传播中, 这两步会使用到 sigmoid 函数。 sigmoid 函数在这里被称为激活函数。 sigmoid 函数   之前在线性回归中,我们用过这个函数,使我们的输出值平滑地处于0~1之间。      观察图形我们发现,当大于5或者小于-5的值无论多大或多小都会被压缩到1或0。如此便带来一个严重问题,即梯度的“饱和效应”。 大于5或者小于-5部分的梯度接近0,这回导致在误差反向传播过程中导数处于该区域的误差就很难甚至根本无法传递至前层,进而导致整个网络无法训练 (导数为0将无法跟新网络参数)。   此外,在参数初始化的时候还需要特别注意,要避免初始化参数直接将输出值带入这一区域,比如初始化参数过大,将直接引发梯度饱和效应而无法训练。 说明: 除非输出层是一个二分类问题否则基本不会用它。 双曲正切函数    tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了原 点,并且值域介于+1和-1之间。     

【TensorFlow】激活函数(Activation Functions)原理解析(十二)

给你一囗甜甜゛ 提交于 2020-02-02 06:00:49
神经网络结构的输出为所有输入的加权和,这导致整个神经网络是一个线性模型。如果将每一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,使得神经网络可以更好地解决较为复杂的问题。这个非线性函数也就是 激活函数 。 神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。 从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。下文将依次对它们进行总结。 TensorFlow提供的激活函数有: 详见官方文档 1、tf.nn.relu(features, name=None) 2、tf.nn.relu6(features, name=None) 3、tf.nn.softplus(features, name=None) 4、tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None) 5、tf.nn.bias_add

深度学习常用激活函数

点点圈 提交于 2020-02-02 02:22:52
参考( https://www.cnblogs.com/home123/p/7484558.html ) ( https://blog.csdn.net/tyhj_sf/article/details/79932893 ) Sigmoid函数 Sigmoid函数曾被广泛地应用,但由于其自身的一些缺陷,现在很少被使用了。Sigmoid函数被定义为: 函数对应的图像是: 优点: 1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。 2.求导容易。 缺点: 1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。 2.其输出并不是以0为中心的。 3.计算exp比较耗时 tanh函数 现在,比起Sigmoid函数我们通常更倾向于tanh函数。tanh函数被定义为 函数位于[-1, 1]区间上,对应的图像是: 优点: 1.比Sigmoid函数收敛速度更快。 2.相比Sigmoid函数,其输出以0为中心。 缺点: 还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。 ReLU ReLU是最近几年非常受欢迎的激活函数。被定义为 对应的图像是: 但是除了ReLU本身的之外,TensorFlow还提供了一些相关的函数,比如定义为min(max(features, 0), 6)的tf.nn.relu6(features, name

【论文阅读笔记】Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification(又一次太长了写不开...)

时光毁灭记忆、已成空白 提交于 2020-01-31 13:29:20
《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classifification, Detection and Segmentation》 (一)论文地址: (二)MobileNets_v2 解决的问题: (三)MobileNets_v2 的核心思想: (四)ReLU 函数的缺陷: (五)Linear Bottleneck: (六)Inverted Residuals: (七)MoblieNets 的网络结构: (八)MobileNets 的应用及实验结果: 1. 图像识别: 2. 目标检测——SSDLite: 3. 语义分割——MobileNet DeepLabv3: (一)论文地址: 《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classifification, Detection and Segmentation》 (二)MobileNets_v2 解决的问题: 2017年作者提出了MobileNets_v1,其核心是将常规的卷积层分解成一个 d e p t h w i s e depthwise d e p t h w i s e s e p a r a b l e separable s e p a r a b

深度学习入门之5--网络学习相关技巧2(权重设置)

ぃ、小莉子 提交于 2020-01-31 00:12:14
目录 1、简述 2、sigmiod权重初始值 3、relu权重初始值 4、案例:不同初始值比较 4.1common文件夹 4.2ch06文件夹 4.2.1weight_init_compare.py 4.3结果 该文章是对《深度学习入门 基于Python的理论与实现》的总结,作者是[日]斋藤康毅 该文将介绍权重的初始值的相关问题。 1、简述 在神经网络的学习中,权重的初始值特别重要。设定什么样的权重初始值,经常关系到神经网络的学习能否成功。且会影响到神经网络学习的速度。 权值衰减:就是一种以 减小权重参数的值 为目的进行学习的方法。通过减小权重参数的值来 抑制过拟合 的发生。 因此,我们在对权值进行初始化的时候,一开始便可以将初始值设置较小,使用Gauss分布生成的值。但是权重的值也不能全部设置为0(或者权值全部相同),将权重初始值设为0的话,将无法正确进行学习。这是因为在误差反向传播法中,所有的权重值都会进行相同的更新,没有意义。 2、sigmiod权重初始值 下面使用sigmoid函数来举例,观察 权重初始值 是如何影响 隐藏层的激活值 的分布的。 目的:通过改变标准差,观察激活函数的变化 例:向一个5层神经网络(激活函数使用sigmoid函数)传入随机生成的输入数据,用直方图绘制各层激活值的数据分布。高斯分布的标准差分别为1, 0.01, 1/sqrt(n)

关于grid_search中param_grid可以选取哪些参数(以keras为例)

纵饮孤独 提交于 2020-01-30 19:32:48
关于grid_search中param_grid可以选取哪些参数(以keras为例) 最近在学习调参时看到了 grid_search (也就是网格搜索算法) https://cloud.tencent.com/developer/article/1447855 细节可以见上面这篇文章 官方原话解释是 param_griddict or list of dictionaries Dictionary with parameters names (string) as keys and lists of parameter settings to try as values, or a list of such dictionaries, in which case the grids spanned by each dictionary in the list are explored. This enables searching over any sequence of parameter settings. param_grid中传入参数列表 找遍了 官方地址 也没有看到,找了很多例子有使用kernel、batchsize、epochs、optimizer的,后来在看到一篇文章时发现 keras 官方地址 给出了详细解释,英文原话如下 When using scikit

pytorch学习笔记(四)——MNIST数据集实战

删除回忆录丶 提交于 2020-01-30 19:04:53
pytorch入门之MINIST数据集实战 目录 神经网络运作流程 回顾 识别的四个步骤 实现代码 目录 神经网络运作流程 上图所示是一个简单的二层神经网络结构,猫和狗的图片作为输入,依次是输入层,隐层,输出层。每张图片作为输入经过模型得到输出判别是猫还是狗,将输入与真实值之间求误差,再对误差求梯度优化参数w和b,使最后得到的误差尽可能小。 回顾 上一个博客中我们讲到,我们将输入X经过一个线性模型得再通过ReLU激活函数得到H1,在经过一次ReLU得到H2,最后一层通常并不使用ReLU激活函数,常见的有sigmoid,softmax的函数,这里我们直接通过一个线性模型得到H3,即为最终的预测输出。 识别的四个步骤 1.首先通过pytorch自带函数完成minist数据集的下载,解析,读取图片 2.建立如上图所示的三层非线性模型 3.输入训练集完成参数的优化 4.输入测试集对训练好的模型进行评估 实现代码 辅助代码utils.py import torch from matplotlib import pyplot as plt def plot_curve ( data ) : #绘制曲线 fig = plt . figure ( ) #创建一个图片 plt . plot ( range ( len ( data ) ) , data , color = 'blue' )

Activation Functions:激活函数

十年热恋 提交于 2020-01-30 19:02:46
1. 激活函数 :激活函数是指在人工神经网络的神经元中,将输入映射到输出端的非线性函数。激活函数通常是非线性的,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,可以应用到非线性模型中。 一般进行线性操作后,就将线性操作的结果放入激活函数中映射。在CNN中,运算顺序通常是卷积 - 池化 - 批量归一化 - 激活函数 常见的激活函数:sigmoid、tanh、ReLU、Maxout、Leaky ReLU、ELU 2. sigmoid :将元素压缩(映射)到0和1之间,当参数过大或过小时,容易造成梯度消失 公式: 图像: 问题: ①梯度消失 ②指数函数e的计算过高 ③函数不以0为中心 梯度消失:当参数过大或过小时,斜率趋向于0,局部梯度为0或者是一个很小很小的值,一直回溯逐步累乘起来,梯度就会趋于0,从而造成梯度消失 4. tanh :将元素映射到-1和1之间,以0为中心,但仍存在梯度消失的问题 公式: 图像: 5. Relu :将元素映射到0和正无穷之间,在大于0的区间上不存在梯度消失的问题。Relu不用计算指数函数,计算效率高、收敛速度快 公式: 图像: 6. Leaky Relu :将元素映射到负无穷到正无穷之间,设置α,选取αx和x中的最大值 公式: 图像:α=0.01 7.ELU :将元素映射到负无穷和正无穷之间, x>=0时,f(x)=x;x<0时

Keras基础自学二(基本模型+手动评估)

半世苍凉 提交于 2020-01-30 04:44:36
from keras.models import Sequential#顺序模型 from keras.layers import Dense#Dense 全连接层 from sklearn.model_selection import train_test_split#利用它的函数分割 import numpy as np seed = 7 # 设定随机数种子 np.random.seed(seed) # 导入数据 dataset = np.loadtxt('D:\example\Keras\pima-indians-diabetes.csv', delimiter=',') # 分割输入x和输出Y,X是已知X,Y是标准答案 x = dataset[:, 0 : 8]#取二维数组中第1(m)维到7维(第n-1维)的所有数据,相当于取第1(m)列到第七(n-1)列的所有数据 yTrain = dataset[:, 8]#取二维数组中第9维的所有数据,相当于取第9列的所有数据 # 分割数据集 x_train, x_validation, Y_train, Y_validation = train_test_split(x, yTrain, test_size=0.2, random_state=seed) #构建模型 model = Sequential() model.add