JavaDay23

学习来源:日撸 Java 三百行(71-80天,BP 神经网络)_闵帆的博客——CSDN博客

通用BP神经网络 (1. 集中管理激活函数)

今天代码主要涉及各种激活函数。

1.ArcTan

        函数表达式:

f(x) = arctan(x)

        导数表达式:

f'(x) = \frac{1}{1+x^{2}}

        函数及导数图像:

2.ELU

        函数表达式:

f(x)=\left\{\begin{matrix} & x& &x\geq 0\\ & \alpha * (e^{x}-1)& &x< 0 \end{matrix}\right.

        导数表达式:

f'(x)= \left\{\begin{matrix} & 1 & &x\geq 0 \\ & \alpha (e^{x}-1)+\alpha & & x<0 \end{matrix}\right.

        函数及导数图像:

 

3.Identity

        函数表达式:

f(x) =x

        导数表达式:

f'(x)=1

        函数及导数图像:

 

4.LeakyReLU

        函数表达式:

f(x) = \left\{\begin{matrix} & x & &x\geq 0 \\ & \alpha \times x & & x< 0 \end{matrix}\right.

        导数表达式:

f'(x)=\left\{\begin{matrix} & 1 & &x\geq0 \\ & \alpha & & x<0 \end{matrix}\right.

        函数及导数图像:

 

5.ReLU

        函数表达式:

f(x) =\left\{\begin{matrix} & x & & x\geq 0\\ & 0 & & x< 0 \end{matrix}\right.

        导数表达式:

f'(x)= \left\{\begin{matrix} & 1 & & x\geq 0\\ & 0 & & x<0 \end{matrix}\right.

        函数及导数图像:

 

6.Softsign

        函数表达式:

f(x) = \left\{\begin{matrix} & \frac{x}{1+x} & &x\geq 0 \\ & \frac{x}{1-x} & &x< 0 \end{matrix}\right.

        导数表达式:

f'(x)=\left\{\begin{matrix} &\frac{1}{(1+x)^{2}} & & x\geq 0\\ &\frac{1}{(1-x)^{2}} & & x<0 \end{matrix}\right.

        函数及导数图像:

 

7.Sigmoid

        函数表达式:

f(x) =\frac{1}{1+e^{-x}}

        导数表达式:

f'(x)=f(x)(1-f(x))

        函数及导数图像:

 

8.Tanh

        函数表达式:

f(x) =\frac{2}{1+e^{-2x}}-1

        导数表达式:

f'(x)=1-f^{2}(x)

函数及导数图像:

 

9.SoftPlus

        函数表达式:

f(x) = ln(1+e^{x})

        导数表达式:

f'(x)=\frac{1}{1+e^{-x}}

        函数及导数图像:

 

10.代码部分

        1)激活函数用于前向传播,激活函数的导数用于反向传播时更新参数;

        2)测试使用Sigmoid函数;

        3)activate用于正向传播;

        4)derive用于反向传播。

代码如下:

package JavaDay23;

/**
 * Activator.
 *
 * @author Ke-Xiong Wang
 */

public class Activator {
    /**
     * Arc tan.
     */
    public final char ARC_TAN = 'a';

    /**
     * Elu.
     */
    public final char ELU = 'e';

    /**
     * Gelu.
     */
    public final char GELU = 'g';

    /**
     * Hard logistic.
     */
    public final char HARD_LOGISTIC = 'h';

    /**
     * Identity.
     */
    public final char IDENTITY = 'i';

    /**
     * Leaky relu, also known as parametric relu.
     */
    public final char LEAKY_RELU = 'l';

    /**
     * Relu.
     */
    public final char RELU = 'r';

    /**
     * Soft sign.
     */
    public final char SOFT_SIGN = 'o';

    /**
     * Sigmoid.
     */
    public final char SIGMOID = 's';

    /**
     * Tanh.
     */
    public final char TANH = 't';

    /**
     * Soft plus.
     */
    public final char SOFT_PLUS = 'u';

    /**
     * Swish.
     */
    public final char SWISH = 'w';

    /**
     * The activator.
     */
    private char activator;

    /**
     * Alpha for elu.
     */
    double alpha;

    /**
     * Beta for leaky relu.
     */
    double beta;

    /**
     * Gamma for leaky relu.
     */
    double gamma;

    /**
     *********************
     * The first constructor.
     *
     * @param paraActivator
     *            The activator.
     *********************
     */
    public Activator(char paraActivator) {
        activator = paraActivator;
    }// Of the first constructor

    /**
     *********************
     * Setter.
     *********************
     */
    public void setActivator(char paraActivator) {
        activator = paraActivator;
    }// Of setActivator

    /**
     *********************
     * Getter.
     *********************
     */
    public char getActivator() {
        return activator;
    }// Of getActivator

    /**
     *********************
     * Setter.
     *********************
     */
    void setAlpha(double paraAlpha) {
        alpha = paraAlpha;
    }// Of setAlpha

    /**
     *********************
     * Setter.
     *********************
     */
    void setBeta(double paraBeta) {
        beta = paraBeta;
    }// Of setBeta

    /**
     *********************
     * Setter.
     *********************
     */
    void setGamma(double paraGamma) {
        gamma = paraGamma;
    }// Of setGamma

    /**
     *********************
     * Activate according to the activation function.
     *********************
     */
    public double activate(double paraValue) {
        double resultValue = 0;
        switch (activator) {
            case ARC_TAN:
                resultValue = Math.atan(paraValue);
                break;
            case ELU:
                if (paraValue >= 0) {
                    resultValue = paraValue;
                } else {
                    resultValue = alpha * (Math.exp(paraValue) - 1);
                } // Of if
                break;
            // case GELU:
            // resultValue = ?;
            // break;
            // case HARD_LOGISTIC:
            // resultValue = ?;
            // break;
            case IDENTITY:
                resultValue = paraValue;
                break;
            case LEAKY_RELU:
                if (paraValue >= 0) {
                    resultValue = paraValue;
                } else {
                    resultValue = alpha * paraValue;
                } // Of if
                break;
            case SOFT_SIGN:
                if (paraValue >= 0) {
                    resultValue = paraValue / (1 + paraValue);
                } else {
                    resultValue = paraValue / (1 - paraValue);
                } // Of if
                break;
            case SOFT_PLUS:
                resultValue = Math.log(1 + Math.exp(paraValue));
                break;
            case RELU:
                if (paraValue >= 0) {
                    resultValue = paraValue;
                } else {
                    resultValue = 0;
                } // Of if
                break;
            case SIGMOID:
                resultValue = 1 / (1 + Math.exp(-paraValue));
                break;
            case TANH:
                resultValue = 2 / (1 + Math.exp(-2 * paraValue)) - 1;
                break;
            // case SWISH:
            // resultValue = ?;
            // break;
            default:
                System.out.println("Unsupported activator: " + activator);
                System.exit(0);
        }// Of switch

        return resultValue;
    }// Of activate

    /**
     *********************
     * Derive according to the activation function. Some use x while others use
     * f(x).
     *
     * @param paraValue
     *            The original value x.
     * @param paraActivatedValue
     *            f(x).
     *********************
     */
    public double derive(double paraValue, double paraActivatedValue) {
        double resultValue = 0;
        switch (activator) {
            case ARC_TAN:
                resultValue = 1 / (paraValue * paraValue + 1);
                break;
            case ELU:
                if (paraValue >= 0) {
                    resultValue = 1;
                } else {
                    resultValue = alpha * (Math.exp(paraValue) - 1) + alpha;
                } // Of if
                break;
            // case GELU:
            // resultValue = ?;
            // break;
            // case HARD_LOGISTIC:
            // resultValue = ?;
            // break;
            case IDENTITY:
                resultValue = 1;
                break;
            case LEAKY_RELU:
                if (paraValue >= 0) {
                    resultValue = 1;
                } else {
                    resultValue = alpha;
                } // Of if
                break;
            case SOFT_SIGN:
                if (paraValue >= 0) {
                    resultValue = 1 / (1 + paraValue) / (1 + paraValue);
                } else {
                    resultValue = 1 / (1 - paraValue) / (1 - paraValue);
                } // Of if
                break;
            case SOFT_PLUS:
                resultValue = 1 / (1 + Math.exp(-paraValue));
                break;
            case RELU: // Updated
                if (paraValue >= 0) {
                    resultValue = 1;
                } else {
                    resultValue = 0;
                } // Of if
                break;
            case SIGMOID: // Updated
                resultValue = paraActivatedValue * (1 - paraActivatedValue);
                break;
            case TANH: // Updated
                resultValue = 1 - paraActivatedValue * paraActivatedValue;
                break;
            // case SWISH:
            // resultValue = ?;
            // break;
            default:
                System.out.println("Unsupported activator: " + activator);
                System.exit(0);
        }// Of switch

        return resultValue;
    }// Of derive

    /**
     *********************
     * Overrides the method claimed in Object.
     *********************
     */
    public String toString() {
        String resultString = "Activator with function '" + activator + "'";
        resultString += "\r\n alpha = " + alpha + ", beta = " + beta + ", gamma = " + gamma;

        return resultString;
    }// Of toString

    /**
     ********************
     * Test the class.
     ********************
     */
    public static void main(String[] args) {
        Activator tempActivator = new Activator('s');
        double tempValue = 0.6;
        double tempNewValue;
        tempNewValue = tempActivator.activate(tempValue);
        System.out.println("After activation: " + tempNewValue);

        tempNewValue = tempActivator.derive(tempValue, tempNewValue);
        System.out.println("After derive: " + tempNewValue);
    }// Of main
}// Of class Activator

 

运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值