tensorflow学习笔记之prelu激活函数原理和代码(代码片段)

我是管小亮 我是管小亮     2022-12-01     170

关键词:

目录

前言

在开始之前,简单说几句,为什么会想到 PReLU 激活函数?因为最近在复现一个论文时遇到了一个【超分辨率】的关键技术——关键亚像素卷积(Sub-Pixel),详情请看我的另一个 b l o g blog blog ——【超分辨率】你真的懂什么是亚像素卷积(Sub-Pixel)嘛???闲言少叙,进入正题。

激活函数

ReLU 激活函数(Rectified Linear Unit),顾名思义:线性整流单元。

为什么要先说 ReLU 函数呢?因为 ReLU 激活函数是目前比较火的一个激活函数,函数表达式: f ( x ) = max ⁡ ( 0 , x ) f(x)=\\max (0, x) f(x)=max(0,x)

函数图像如下:

相比于传统激活函数,比如: sigmod 函数和 tanh 函数,它有以下几个优点:

  1. 仿生物学原理:相关大脑方面的研究表明生物神经元的信息编码通常是比较分散及稀疏的。通常情况下,大脑中在同一时间大概只有1%-4%的神经元处于活跃状态。使用线性修正以及正则化(regularization)可以对机器神经网络中神经元的活跃度(即输出为正值)进行调试;相比之下,逻辑函数在输入为0时达到 ,即已经是半饱和的稳定状态,不够符合实际生物学对模拟神经网络的期望。

    不过需要指出的是,一般情况下,在一个使用修正线性单元(即线性整流)的神经网络中大概有50%的神经元处于激活态。

  2. 更加有效率的梯度下降以及反向传播:在输入为正数的时候,避免了梯度爆炸和梯度消失问题。

  3. 简化计算过程,计算速度更快:没有了其他复杂激活函数中诸如指数函数的影响;同时活跃度的分散性使得神经网络整体计算成本下降。

当然,缺点也是有的:

  1. 当输入是负数的时候,ReLU 是完全不被激活的,这就表明一旦输入到了负数,ReLU 就会死掉。这样在前向传播过程中,还不算什么问题,有的区域是敏感的,有的是不敏感的。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和 sigmod 函数、tanh 函数有一样的问题。

  2. 我们发现 ReLU 函数的输出要么是0,要么是正数,这也就是说,ReLU 函数也不是以0为中心的函数。

ReLU 代码实现

代码实现也比较容易,在 TensorFlow 中有对应的函数(https://tensorflow.google.cn/api_docs/python/tf/nn/relu)可以直接调用:

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

该函数用于计算整流线性: m a x ( f e a t u r e s , 0 ) max(features, 0) max(features,0)

ARGS:

  • features:A Tensor。必须是下列类型之一:float32,float64,int32,uint8,int16,int8,int64,bfloat16,uint16,half,uint32,uint64,qint8。
  • name:操作的名称(可选)。

Returns:

  • 一个Tensor,与features具有相同的类型。

PReLU 激活函数

  • 论文全称:Delving Deep into Rectifiers : Surpassing Human-Level Performance on ImageNet Classification

  • 论文链接:https://arxiv.org/pdf/1502.01852.pdf

PReLU 激活函数(Parametric Rectified Linear Unit),顾名思义:带参数的ReLU。二者的定义和区别如下图:

很明显地看出,PReLU 函数是针对 ReLU 函数的一个改进型:在负数区域内,PReLU 激活函数有一个很小的斜率,这样也可以避免 ReLU 激活函数死掉的问题。相比于 ELU,PReLU 在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。

我们看 PReLU 的公式: f ( x ) = max ⁡ ( a x , x ) f(x)=\\max (a x, x) f(x)=max(ax,x),其中 a 是可以学习的的,参数 a 一般是取 0~1 之间的数。如果 a 是一个很小的固定值(如 a = 0.01),则 PReLU 退化为 Leaky ReLU(LReLU),算是PReLU的一种特殊情况吧。

PReLU 代码实现

PReLU 激活函数的实现似乎直接基于 PReLU 的函数表达式进行代码实现就可以了(请参阅:更高级别库的 keras 、tflearn 和 tensorlayer )。

我这里是基于 TensorFlow 框架搭建的网络,所以也可以通过 TensorFlow 进行 PReLU 函数的编程和实现。下面这只是其中一种解决方案:

def prelu(_x, name):
    """parametric ReLU activation"""
    _alpha = tf.get_variable(name + "prelu",
                             shape=_x.get_shape()[-1],
                             dtype=_x.dtype,
                             initializer=tf.constant_initializer(0.1))
    pos = tf.nn.relu(_x)
    neg = _alpha * (_x - tf.abs(_x)) * 0.5

    return pos + neg

博主注:上面的解决方法是经过试验验证可行的,这一点不用担心。

需要注意的问题

使用 PReLU 函数会引入一个参数,这会增加你原有网络的复杂性,包括读取数据时的批量和大小,我以自己实验室的情况为例。

这是我显卡的型号和显存大小:


这是我显卡对应电脑的处理器配置、RAM和操作系统版本:


在使用 PReLU 函数之前

参数数量
迭代次数30
训练集数量8000
学习率1e-4
每次读入训练集的图片数2
训练图片大小512 x 512
使用 ReLU 函数的数量34

在使用 PReLU 函数之后

参数数量
迭代次数30
训练集数量8000
学习率1e-4
每次读入训练集的图片数1
训练图片大小512 x 512
使用 ReLU 函数的数量15
使用 PReLU 函数的数量19

我在实际操作的时候:

  • 首先是把全部的 ReLU 函数都换成 PReLU 函数,其他参数不变,出现OOM错误,也就是显存不够的错误;
  • 其次是调整每次读入训练集的图片数,从2到1,其他参数不变,还是出现OOM错误,也就是显存不够的错误;
  • 最后是调整部分 ReLU 函数为 PReLU 函数,其他参数不变,终于可以正常进行训练的过程。

博主注:我这里使用的这种解决方法有一些细节问题还是需要注意的。

  • 首先是和原论文中的 PReLU 函数,依靠,也就是带动量的更新方式,动量在 AdamOptimizer 优化器中存在。
  • 其次,本文的 PReLU 函数,增加了极少量的参数,也就意味着网络的计算量以及过拟合的危险性都只增加了一点点,但是可以增强网络的特征提取能力,方便于亚像素卷积网络的实现。
  • 最后,因为亚像素卷积网络的上采样过程其实并不是卷积,而是插值,所以没有用于学习的参数,导致整个网络的学习能力只能由前半部分的网络进行学习,引入了一个 PReLU 函数的参数可以增加网络的学习能力。

如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

回复【福利】即可获取我为你准备的大礼,包括C++,编程四大件,NLP,深度学习等等的资料。

想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

参考文章

机器学习笔记:激活函数

1激活函数综述激活函数:对输入信号进行线性/非线性变换2 为什么激活函数要是非线性函数        如果不用激活函数,在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经... 查看详情

吴恩达深度学习笔记(代码片段)

...eLU函数(PReLU)ELU(ExponentialLinearUnits)函数总结前言学习的第二天一、一些基础的numpy语法importnumpyasnpa=np 查看详情

机器学习笔记:形象的解释神经网络激活函数的作用是什么?

...nbsp;忆臻原出处:https://zhuanlan.zhihu.com/p/25279356查阅资料和学习,大家对神经网络中激活函数的作用主要集中下面这个观点:激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。下面我分别从这个方面通过例子给... 查看详情

tensorflow学习-------激活函数(activationfunction)

...数曲线绘制代码2.3随机化正则函数drop函数3.激活函数选择tensorflow学习——-激活函数(activationfunction)1.激活函数  激活函数(activationfunction)运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经... 查看详情

激活函数学习(2022.2.28)(代码片段)

激活函数学习(2022.2.28)所用软件及环境(Matlab+PyCharm+Python+Tensorflow+Keras+PyTorch)1、激活函数简介1.1ActivationFunction1.2PyTorch激活函数API1.3TensorFlow+Keras激活函数API2、常用的激活函数&# 查看详情

prelu与relu

PReLU激活函数,方法来自于何凯明paper 《DelvingDeepintoRectifiers:SurpassingHuman-LevelPerformanceonImageNetClassification》PReLU激活PReLU(ParametricRectifiedLinearUnit),顾名思义:带参数的ReLU。二者的定义和区别如下图: 如果ai=0,那么PR 查看详情

深度学习笔记:激活函数常见问题总结

...什么tanh收敛速度比sigmoid快理论系列:    深度学习笔记(一):卷积层+激活函数+池化层+全连接层    深度学习笔记(二):激活函数的前世今生    深度学习 查看详情

深度学习笔记:激活函数常见问题总结

...什么tanh收敛速度比sigmoid快理论系列:    深度学习笔记(一):卷积层+激活函数+池化层+全连接层    深度学习笔记(二):激活函数的前世今生    深度学习 查看详情

tensorflow实战google深度学习框架笔记codepart(代码片段)

深层神经网络线性模型的局限性激活函数实现去线性化a=tf.nn.relu(tf.matmul(x,w1)+biases1)y=tf.nn.relu(tf.matmul(a,w2)+biases2)经典损失函数#计算交叉熵cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,le-10,1.0)))#tf.clip_by_value样例 查看详情

学习打卡03可解释机器学习笔记之cam类激活热力图

可解释机器学习笔记之CAM类激活热力图文章目录可解释机器学习笔记之CAM类激活热力图CAM介绍CAM算法原理GAP全局平均池化GAPVSGMPCAM算法的缺点及改进CAM可视化同张图,不同类别不同图,同个类别CAM弱监督定位用语义特征编... 查看详情

tensorflow函数学习笔记

##tf.Variable(??)  创建tf变量##tf.matmul(w,x)    矩阵乘法w=tf.Variable([[0.5,1.0]])x=tf.Variable([[2.0],[1.0]])y=tf.matmul(w,x)init_op=tf.global_variables_initializer()withtf.Ses 查看详情

学习笔记tf014:卷积层激活函数池化层归一化层高级层

...卷积层,减少过拟合,加速训练过程,降低内存占用率。TensorFlow加速所有不同类弄卷积层卷积运算。tf.nn.depthwise_conv2d,一个卷积层输出边接到另一个卷积层输入,创建遵循Inception架构网络RethinkingtheInceptionArchitect 查看详情

深度学习基础之激活函数(代码片段)

文章目录激活函数阶跃函数sigmoid函数sigmoid函数和阶跃函数的比较为什么激活函数要用非线性函数?ReLU函数-线性整流函数LeakyReLU函数-带泄露线性整流函数tanh函数-双曲正切函数参考激活函数激活函数是连接感知机和神经网络... 查看详情

tensorflow学习笔记2——数据类型及简单运算

首先,激活tensorflow环境( sourceactivatetensorflow ),随后1importtensorflowastf2sess=tf.Session()1.常量创建标量(scalar)或张量(tensor)形式的常量1tf.constant(value,dtype=None,shape=None,name=‘Const‘,verify_shape=Fals 查看详情

tensorflow学习教程------代价函数

二次代价函数(quadraticcost): 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,使用一个样本为例进行说明,此时二次代价函数为: 假如我们使用梯度下降法(Gradientdescent)来调整权值参数... 查看详情

tensorflow笔记之mnist手写识别系列一

tensorflow笔记(四)之MNIST手写识别系列一版权声明:本文为博主原创文章,转载请指明转载地址http://www.cnblogs.com/fydeblog/p/7436310.html前言这篇博客将利用神经网络去训练MNIST数据集,通过学习到的模型去分类手写数字。我会将本篇... 查看详情

如何高效的学习tensorflow代码

如何高效的学习TensorFlow代码?目前TensorFlow代码已超过40w行,从代码量上来看,绝不是一个能够迅速上手的小项目。所以,想要精通TensorFlow的同学需要做好心理准备。对于想要学习TensorFlow(以下简称TF)的人,根据目的不同,可... 查看详情

tensorflow学习笔记

tensorflow一些函数:1、tf.ones(shape,type=tf.float32,name=None)   tf.ones([2,3],int32)==>[[1,1,1],[1,1,1]] 2、tf.zeros(shape,type=tf.float32,name=None)   tf.zeros([2,&nb 查看详情