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

来源:互联网 发布:鬼气凛然实体书淘宝 编辑:程序博客网 时间:2024/06/06 02:58

微软研究院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__}
0 0
原创粉丝点击