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):

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__}

本文系作者原创,转载请先联系作者: 18254275587@163.com