激活函数maxout

  • 系列文章:

  maxout函数相对于其他的激活函数有很大的区别,可以看做是在神经网络中激活函数的地方加入一个激活函数层。 maxout可以看做是一个可学习的分段线性函数,因为可学习所以是需要参数的,而且参数是可以通过反向传播来学习的。因为参数量的增大,势必导致计算量的增大。
  传统的神经网络从第i层输入到第i+1层,只需要训练一组权重参数,这些参数决定了上一层输入到到达这一层之后进行的变换。但是maxout做的事情就是第i层到第i+1层之前我们多训练一些参数,对第i层的输出,我们将每个输出连接k个隐藏层,通过k个隐藏层的参数进行计算之后,然后把这k个隐藏层求最大值,作为最终的输出。

  这里我们给出maxout的计算公式。

  ,使用maxout需要人为的设定一个参数k,这个参数k就是每个神经元输出之后接的虚拟隐藏层的个数。而权重参数W的维度是(d,m,k)(d,m,k)(d,m,k)的,d代表的是输入节点的个数,m代表的则是输出层节点的个数。这也是之前神经网络第i+1层的参数设置。但是现在多出来一个维度k,就是为了产生中间的k个输出,然后将这k个输出再取一个最大值。

  如上图,原本的神经网络只有输入的两个神经元x,输出的只有一个神经元hi(x)h_i(x)hi​(x),普通的神经元则是直接把x和hi(x)h_i(x)hi​(x)连接,现在相当于在两层之间又增加了k=5k=5k=5个参数,然后输入先经过这个maxout的隐藏层得到输出,然后对输出取最大值,再输入到下一层当中。其中虚拟隐藏层的WWW和bbb就是所需要学习的参数。可以看到,参数量的增大是针对每一个输出神经元增加k个的。
  普通的神经元配合激活函数得到一组输出,经过了maxout将会得到k组输出,然后在k组之中取最大值。可见maxout非线性的拟合能力是更强的,因为参数更多,而且可学习。我们能想到relu(z)=max(0,z)relu(z)=max(0,z)relu(z)=max(0,z),而maxout也是取最大,如果我们能让一个虚拟神经元学习m(x)=xm(x)=xm(x)=x,一个虚拟神经元学习m(x)=0m(x)=0m(x)=0,然后两个神经元求最大就得到了relu激活函数。可见这是k=2的情况,如果我们有更多的k,就可以学习更加负责的激活函数,这就是maxout拟合能力更强的原因。事实上maxout可以拟合任意的凸函数。
  相比于ReLU,ReLU有的优点maxout有,是分段线性的,不容易梯度消失。同时ReLU没有的优点,maxout可能也有,比如神经元不会死亡。但是这些优点是通过计算量换来的,maxout的计算量非常大,我们已经解释过。
  这个激活函数的实现没什么难的,就是在指定的维度上取最大值即可,但是为了得到能够得到这个要取最大值的维度的变量,往往需要在上一层的神经元上做手脚,需要增加参数量。原本是m维的输出通道数,现在需要变成k×m的数出通道。给出tensorflow代码示例。

x=tf.random_normal([1,3])
m=4  # out_channel
k=3  # maxout_chanenl
d=x.get_shape().as_list()[-1]
W=tf.Variable(tf.random_normal(shape=[d,m,k]))
b=tf.Variable(tf.random_normal(shape=[m,k]))
# 从W和b的维度看出参数量是增大了
dot_z=tf.tensordot(x,W,axes=1)+b
z=tf.reduce_max(dot_z,axis=2)  # 这里再把maxout的通道给取最大降维下去with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(sess.run([x,dot_z,z]))

  事实上这里还有一种方式就是为maxout特殊定义一个方法或者类,然后就可以像其他普通的激活函数一样使用。以下给出tensorflow代码示例。

def maxout(inputs, num_units, axis=None):'''inputs: 上一层的输出的结果,这里需要上一层的输出结果的维度是k*mnum_units:激活后的最终的输出结果数m'''shape = inputs.get_shape().as_list()if axis is None:# Assume that channel is the last dimensionaxis = -1num_channels = shape[axis]if num_channels % num_units:raise ValueError('number of features({}) is not a multiple of num_units({})'.format(num_channels, num_units))shape[axis] = num_unitsshape += [num_channels // num_units]for i in range(len(shape)):if shape[i] is None:shape[i] = -1outputs = tf.reduce_max(tf.reshape(inputs, shape), -1, keepdims=False)return outputs# X.shape = (..., d)
X = tf.layers.conv2d(inputs=X, filters=k * m, kernel_size, strides, padding)
# X.shape = (..., m*k)
X = maxout(inputs=X, num_units=m)
# X.shape = (..., m)

系列文章:

神经网络中的激活函数总述
sigmoid激活函数
tanh激活函数
ReLU系列激活函数
maxout激活函数
Swish激活函数
激活函数发展的新里程——EvoNorms

激活函数maxout相关推荐

  1. Maxout激活函数

    Maxout激活函数 maxout激发函数,则其隐含层节点的输出表达式为: 这里的W是3维的,尺寸为d*m*k,其中d表示输入层节点的个数,m表示隐含层节点的个数,k

  2. 神经网络中常用激活函数总结

    好久没写博客和学习笔记了,感觉最近总是没有学习状态呀,就很烦.虽说确实是有在看一些视频课程但是总是精神有力,每天过得也好快总感觉啥都没学时间就过去了阿西.还是得逼最近写写笔记才能不那么恍惚.前几天开始 ...

  3. 【2】深度神经网络的损失函数/激活函数

    文章目录 1.平方差损失函数 && Sigmoid激活函数 1.1 Sigmoid函数 1.2 平方差损失函数在反向传播时的Wl和blW^l和b^lWl和bl梯度更新式 2.交叉熵损失 ...

  4. 神经网络激活函数及其Katex公式代码模板合集

    | 图源1.图源2   KaTeX 是一个快速为网站呈现 Tex 科学公式的简单易用的库,通过它我们可以方便快速的书写公式.KaTeX由关键词(标签)和其作用的参数所构成,每个关键词(标签)参数的作用 ...

  5. 激活函数Sigmoid

    激活函数Sigmoid 系列文章:    上一节激活函数中已经讨论了激活函数的重要性,和大致发展路径.本文直接讨论SIgmoid激活函数,这是比较早的激活函数了,使用也非常广泛,这个函数又叫Logis ...

  6. 深度模型之激活函数以及Initializer

    文章目录 1.为什么要激活函数 2.常见激活函数 2.1.sigmoid激活函数 2.2.tanh激活函数 2.3.Relu激活函数 2.4.PRelu 2.4.1.RRelu 2.4.2.Leaky ...

  7. 机器学习、计算机视觉面经整理(持续完善整理中……)

    算法岗计算机视觉方向求职经验总结 进入11月份,楼主找工作也基本进入尾声了,从7月份开始关注牛客网,在求职的过程中学到了不少,感谢牛客提供这样一个平台,让自己的求职历程不再孤单. 先说一下楼主教育背景 ...

  8. 深度学习笔记整理(五)——提高泛化能力的方法

    1.训练样本 数据增强 方法:通过对样本图像平移.旋转或镜像翻转,增加样本数量: 优点:使有限的数据得到最大程度的有效利用. 使用大规模数据集 ImageNet:基于WorldNet,按层级图像分类, ...

  9. Connectionist Temporal Classification(CTC)、音识别模型小型综述和一个简易的语音识别模型的tensorflow实现

    CTC是一种端到端的语音识别技术,他避免了需要字或者音素级别的标注,只需要句子级别的标注就可以进行训练,感觉非常巧妙,也很符合神经网络浪潮人们的习惯.特别是LSTM+CTC相较于之前的DNN+HMM, ...

  10. 神经网络激活函数sigmoid、tanh、Relu、LeakyRelu、Elu、PRelu、MaxOut的java实现

    神经网络常用激活函数包括sigmoid.tanh.Relu.LeakyRelu.Elu.PRelu和MaxOut.对每一种函数采用java进行实现.前面四种激活函数是固定形式,后面三种激活函数部分参数 ...

最新文章

  1. python+opencv图像拼接-python opencv 图像拼接的实现方法
  2. java中的数据库事务处理
  3. 简明python教程 --C++程序员的视角(二):函数及作用域
  4. 【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
  5. [-] Handler failed to bind to x.x.x.x:port排错
  6. IO流递归拷贝一个文件夹里面的所有文件,到另一个文件夹。如果重复不拷贝,可续拷
  7. recvfrom 无法接收 icmp 差错数据包_利用ICMP隧道技术实现C2通信
  8. java 怎么获取键的值_在 Java 中如何获取 Map 的所有键和值
  9. 正则表达式过滤联系方式,微信手机号QQ等
  10. sina vistor system
  11. python 英文关键词提取_python 利用jieba.analyse进行 关键词提取
  12. 生死看淡,不服就GAN(六)----用DCGAN生成马的彩色图片
  13. ListView+Fragment实现导航栏
  14. 20190313(已解决)对于jsp界面与action界面关系的说明_yingruiyuelin_新浪博客
  15. 云计算为什么发展_为什么快速发展的公司需要云计算? 第1部分
  16. 创建 Pynq Overlay
  17. 区块链方向的论文如何查找
  18. JavaWeb自学笔记,ServletAPI编程常用接口和类
  19. win10删除历史壁纸记录
  20. 4.3 文本数据分析

热门文章

  1. 火车头文章标题伪原创插件(文章双标题插件)
  2. 扫地机器人欠压检测电路_36v欠压保护电路图大全(六款模拟电路设计原理图详解)...
  3. 《信息安全技术》 实验四 木马及远程控制技术
  4. 机械电钢琴音源 Cinesamples Keyboard In Blue Kontakt
  5. 流行技术产生的根源-阿朱吕建伟的个人观察
  6. 接管理器是Android上最,10 款优秀的 Android 文件管理器
  7. python控制电脑音量,声音之控制音量,,
  8. Android蓝牙音量调节,安卓 蓝牙音量控制 Bluetooth Volume Control v2.40 付费高级特别版...
  9. bt5重启网卡命令_BT5找不到无线网卡怎么处理
  10. 攻防世界 --> funny_video --> 最完整和正确的解答