激活函数

各激活函数曲线对比

常用激活函数:

  1. tf.sigmoid()
  2. tf.tanh()
  3. tf.nn.relu()
  4. tf.nn.softplus()
  5. tf.nn.softmax()
  6. tf.nn.dropout()
  7. tf.nn.elu()
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.misc import derivative
  1. def sigmoid(x):
  2. y = 1 / (1 + np.exp(-x))
  3. return y
  1. def tanh(x):
  2. return (np.exp(x) - np.exp(-x)) / (np.exp(x)+np.exp(-x))
  1. def relu(x):
  2. return [max(xi,0) for xi in x]
  1. def elu(x,a=1):
  2. y = []
  3. for xi in x:
  4. if xi >= 0:
  5. y.append(xi)
  6. else:
  7. y.append(a*(np.exp(xi)-1))
  8. return y
  1. def softplus(x):
  2. return np.log(1+np.exp(x))
  1. def derivative_f(func,input,dx=1e-6):
  2. y = [derivative(func,x,dx) for x in input]
  3. return y
  1. x = np.linspace(-5,5,1000)
  2. flg = plt.figure(figsize=(15,5))
  3. ax1 = flg.add_subplot(1,2,1)
  4. ax1.axis([-5,5,-1,1])
  5. plt.xlabel(r'active function',fontsize=18)
  6. ax1.plot(x,sigmoid(x),'r-',label='sigmoid')
  7. ax1.plot(x,tanh(x),'g--',label='tanh')
  8. ax1.plot(x,relu(x),'b-',lw=1,label='relu')
  9. ax1.plot(x,softplus(x),'y--',label='softplus')
  10. ax1.plot(x,elu(x),'b--',label='elu')
  11. ax1.legend()
  12. ax2 = flg.add_subplot(1,2,2)
  13. plt.xlabel(r'derivative',fontsize=18)
  14. ax2.plot(x,derivative_f(sigmoid,x),'r-',label='sigmoid')
  15. ax2.plot(x,derivative_f(tanh,x),'g--',label='tanh')
  16. ax2.plot(x,derivative_f(softplus,x),'y-',label='softplus')
  17. ax2.legend()
  18. plt.show()

各激活函数优缺点

sigmoid函数

  1. 优点:在于输出映射在(01)范围内,单调连续,适合用作输出层,求导容易
  2. 缺点:一旦输入落入饱和区,一阶导数接近0,就可能产生梯度消失的情况

tanh函数

  1. 优点:输出以0为中心,收敛速度比sigmoid函数要快
  2. 缺点:存在梯度消失问题

relu函数

  1. 优点:目前最受欢迎的激活函数,在x<0时,硬饱和,在x>0时,导数为1,所以在x>0时保持梯度不衰减,从而可以缓解梯度消失的问题,能更快收敛,并提供神经网络的稀疏表达能力
  2. 缺点:随着训练的进行,部分输入或落入硬饱和区,导致无法更新权重,称为‘神经元死亡’

elu函数

  1. 优点:有一个非零梯度,这样可以避免单元消失的问题
  2. 缺点:计算速度比relu和它的变种慢,但是在训练过程中可以通过更快的收敛速度来弥补

softplus函数

  1. 该函数对relu做了平滑处理,更接近脑神经元的激活模型

softmax函数

  1. 除了用于二分类还可以用于多分类,将各个神经元的输出映射到(0,1空间)

dropout函数

  1. tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)
  2. 一个神经元以概率keep_prob决定是否被抑制,如果被抑制,神经元的输出为0,如果不被抑制,该神经元将被放大到原来的1/keep_prob倍,默认情况下,每个神经元是否被抑制是相互独立的

一般规则

  1. 当输入数据特征相差明显时,用tanh效果很好,当特征相差不明显时用sigmoid效果比较好,sigmoidtanh作为激活函数需要对输入进行规范化,否则激活后的值进入平坦区,而relu不会出现这种情况,有时也不需要输入规范化,因此85%-90%的神经网络会使用relu函数

损失函数

sigmoid_cross_entropy_with_logits函数

  1. tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None)
  2. 该函数不仅可以用于二分类,也可以用于多分类,例如:判断图片中是否包含几种动物中的一种或多种

二分类logstic损失函数梯度推导

二项逻辑斯蒂回归模型是一种分类模型,由条件概率p(y|x)表示,形式未参数化的逻辑斯蒂分布,这里的变量X为实数,随机变量y取值为1或0,逻辑斯蒂模型条件概率分布如下:$$p(y=1|x) = \frac{\exp(w{\bullet}x+b)}{1+\exp(w{\bullet}x+b)}$$

\[p(y=0|x) = \frac{1}{1+\exp(w{\bullet}x+b)}
\]

假设$$p(y = 1|x) = \theta(x),p(y=0|x) = 1 - \theta(x)$$

损失函数:$$L(\theta(x)) = -\prod_{i=1}N[\theta(x_i)]{y_i}[1-\theta(x_i)]^{1-y_i}$$

对数似然函数:$$L(\theta(x)) = -\sum_{i=1}^Ny_i * \log\theta(x_i)+(1-y_i)\log(1-\theta(x_i))$$

求\(L(\theta(x))\)的极大值,得到w的估计值,由于\(L(\theta(x))\)为凸函数,可以直接求损失函数的一阶偏导:

\[\frac{\delta{L}}{\delta{w_j}} = -\sum_{i=1}^N[y_i*\frac{1}{\theta(x_i)} - (1-y_i)*\frac{1}{1-\theta(x_i)}] *\frac{\delta{\theta(x)}}{\delta{w_j}}
\]

由于\(\frac{\delta{\theta(x)}}{\delta{w}} = \theta(x_i) * (1 - \theta(x_i))*x_j^i\)

得到:$$\frac{\delta{L}}{\delta{w_j}} = -\sum_{i=1}N(y_i-\theta(x_i))*x_ji$$

weighted_cross_entropy_with_logits函数

  1. tf.nn.weighted_cross_entropy_with_logits(targets,logits,pos_weight,name=None)
  2. pos_weight正样本的一个系数
  3. 该函数在sigmoid_cross_entropy_with_logits函数的基础上为每个正样本添加了一个权重,其损失函数如下:

\[loss_{ij} = -[post_{weight}p_{ij}\log p_{ij}+(1-p_{ij})\log (1-p_{ij})]
\]

softmax_cross_entropy_with_logits函数

  1. tf.nn.softmax_cross_entropy_with_logits(_sentinel,labels,logits,name)
  2. 适用于每个类别相互独立且排斥的情况,例如,判断的图片只能属于一个种类而不能同时包含多个种类
  3. 损失函数:

\[logits_{ij} = \frac{e^{logits_{ij}}}{\sum_{j=0}^{numclass-1}e^{logits_{ij}}}
\]

\[loss_{i} = -\sum_{j=0}^{numclass-1}label_{ij}\log (logits_{ij})
\]

sparse_softmax_cross_entropy_with_logits函数

  1. tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel,labels,logits,name)
  2. 该函数与softmax_cross_entropy_with_logits的唯一区别在于labels,该函数的标签要求排他性的即只有一个正确类型,labels的形状要求是[batch_size]而值必须是从0开始编码的int32int64,而且范围是[0,num_class],该函数没用过

tensorflow中常用激活函数和损失函数的更多相关文章

  1. tensorflow中常用学习率更新策略

    神经网络训练过程中,根据每batch训练数据前向传播的结果,计算损失函数,再由损失函数根据梯度下降法更新每一个网络参数,在参数更新过程中使用到一个学习率(learning rate),用来定义每次参数 ...

  2. 在TensorFlow中基于lstm构建分词系统笔记

    在TensorFlow中基于lstm构建分词系统笔记(一) https://www.jianshu.com/p/ccb805b9f014 前言 我打算基于lstm构建一个分词系统,通过这个例子来学习下 ...

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

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

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

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

  5. 机器学习之路:tensorflow 深度学习中 分类问题的损失函数 交叉熵

    经典的损失函数----交叉熵 1 交叉熵: 分类问题中使用比较广泛的一种损失函数, 它刻画两个概率分布之间的距离 给定两个概率分布p和q, 交叉熵为: H(p, q) = -∑ p(x) log q( ...

  6. SELU︱在keras、tensorflow中使用SELU激活函数

    arXiv 上公开的一篇 NIPS 投稿论文<Self-Normalizing Neural Networks>引起了圈内极大的关注,它提出了缩放指数型线性单元(SELU)而引进了自归一化 ...

  7. Pytorch_第九篇_神经网络中常用的激活函数

    神经网络中常用的激活函数 Introduce 理论上神经网络能够拟合任意线性函数,其中主要的一个因素是使用了非线性激活函数(因为如果每一层都是线性变换,那有啥用啊,始终能够拟合的都是线性函数啊).本文 ...

  8. TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵

    TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵 神经元模型:用数学公式比表示为:f(Σi xi*wi + b), f为激活函数 神经网络 是以神经元为基本单位构成的 激 ...

  9. 使用TensorFlow中的Batch Normalization

    问题 训练神经网络是一个很复杂的过程,在前面提到了深度学习中常用的激活函数,例如ELU或者Relu的变体能够在开始训练的时候很大程度上减少梯度消失或者爆炸问题.但是却不能保证在训练过程中不出现该问题, ...

随机推荐

  1. 利用同步网盘搭建个人或团队SVN服务器

    这篇文章是以前写的,现在强烈推荐两个站.1.http://git.oschina.com 2.http://www.coding.net. 推荐理由:1.可创建私有项目.2.免费稳定.3.VS2013 ...

  2. [CTSC2008]祭祀

    题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...

  3. 大牛是怎么思考设计MySQL优化方案的?

    在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...

  4. js以excel为模板的打印

    使用excel为模板打印的好处是格式容易调整,这种方法要求客户端系统配置高度统一,譬如excel安装版本一致,存在服务器上的excel模板必须与客户端excel版本一致,而且不能用其他版本的excel ...

  5. Tomcat出现java.lang.Exception: Socket bind failed

    今天测试系统,Tomcat(apache-tomcat-6.0.20windows版)突然出现异常,导致JSP页面无法运行.错误提示如下:2014-3-12 17:13:29 org.apache.c ...

  6. JNI_Z_02_函数参数_JNIEnv*_jclass_jobject

    1. 1.1.JNIEXPORT void JNICALL Java_包名_类名_函数名01(JNIEnv * env, jclass clazz) // Java代码中的 静态函数 1.2.JNIE ...

  7. 利用JS获取地址栏的中文参数

    地址栏中为:localhost:22865/ZYHSYY.aspx?BQH=305&DoctorName=张三&DoctorId=100我想利用JS获取到“张三”,请问该如何写js?目 ...

  8. ArcGIS API For Silverlight使用在线地图的多种方法总结

    引自:http://www.cnblogs.com/meimao5211/p/3283969.html ArcGIS API For Silverlight使用在线地图的多种方法总结 本人也正在学习A ...

  9. 配置Nginx作为反向代理服务器

    最近在实习公司的开发一个项目,项目是前后端彻底分离的项目,前端项目和后端项目各监听着特定的端口号,显然不是80的通用端口,为了不在地址栏上输入IP+端口号的形式,我们可以使用Nginx作为反向代理服务 ...

  10. node-wechat 微信推送消息

    https://github.com/nswbmw/node-wechat/blob/master/index.js