PRelu--Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

微软研究院2015的一篇论文。

1.概要:

PRelu其实是Relu的增强版,PRelu使得模型在ImageNet2012上的结果提高到4.94%,超过普通人的正确率;PRelu需要像更新权重weights一样使用BP更新一个额外的参数,但是相较于weights的数量来说,PRelu需要更新的参数总数可以忽略不计,所以不会加重overfitting的影响。
如果PRelu的参数为0,那其实就是Relu;如果PRelu的参数为一个很小的常数constant,比如0.01,那其实就是Leaky Relu(LRelu)。
Relu与PRelu的比较:

这里写图片描述

PRelu的表达式:

这里写图片描述

2.idea:

1): 每一个feature map(CNN)对应的PRelu的系数都可以是不同的,也可以是相同层的PRelu的系数都一样,层间不同。
2): 作者在实验的时候都是将系数初始化为0.25
3): 优化的时候不会对PRelu的系数进行regularization,否则会让系数趋近于0,基本相当于LRelu或者Relu了。

3.流程:

PRelu的系数也是在BP的时候进行优化的,与weights的方式一样
目标函数对PRelu的系数求偏导:

这里写图片描述

优化:

这里写图片描述

4.代码(keras):

class PReLU(MaskedLayer):
    '''
        Reference:
            Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
                http://arxiv.org/pdf/1502.01852v1.pdf
    '''
    def __init__(self, input_shape, init='zero', weights=None):
        super(PReLU, self).__init__()
        self.init = initializations.get(init)
        self.alphas = self.init(input_shape)
        self.params = [self.alphas]
        self.input_shape = input_shape

        if weights is not None:
            self.set_weights(weights)

    def get_output(self, train):
        X = self.get_input(train)
        pos = ((X + abs(X)) / 2.0)
        neg = self.alphas * ((X - abs(X)) / 2.0)
        return pos + neg

    def get_config(self):
        return {"name": self.__class__.__name__,
                "input_shape": self.input_shape,
                "init": self.init.__name__}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值