第2关:激活函数

任务描述

本关任务:通过对激活函数知识的学习,使用 Python 编写指定的激活函数。

相关知识

为了完成本关任务,你需要掌握:

  1. 激活函数概述;
  2. 线性函数;
  3. Sigmoid 函数;
  4. Tanh 函数;
  5. ReLU 函数;
  6. Python 补充知识。

激活函数概述

神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。 激活函数是计算神经网络中非常重要的一环,激活函数增加了神经网络模型的非线性特征,倘若神经网络中不存在激活函数,那么无论神经网络的深度有多少层 ,最终均是若干次的矩阵相乘,若输入输出依然存在线性关系,则对于机器学习就失去了意义 。

线性函数

线性函数十分的简单,就是我们常见的函数,其数学形式如下:

f(x)=a\ast x+b

其中ab 均为常数。

Sigmoid 函数

Sigmoid 函数是一个有着优美 s 形曲线的数学函数,在逻辑回归、人工神经网络中有着广泛的应用。其数学形式如下:

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

其对应的图像如图1所示:


图1 Sigmoid 函数图像

优点:

  1. Sigmoid 函数的输出映射在 (0,1) 之间,单调连续,输出范围有限,优化稳定。
  2. Sigmoid 函数求导容易。

缺点:

  1. Sigmoid 函数由于饱和性,容易产生梯度消失。
  2. Sigmoid 函数的输出并不是以 0 为中心。

在使用numpy实现 Sigmoid 函数时,en可以使用numpy.exp(n)函数实现:

 
  1. import numpy as np
  2. e_10 = np.exp(10) # e^10

Tanh 函数

Tanh 函数也叫双曲正切函数,其数学形式如下:

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

其对应的图像如图2所示:


图2 Tanh 函数图像

 

优点:

  1. Tanh 函数比 Sigmoid 函数收敛的更快。
  2. 与 Sigmoid 函数相比,Tanh 函数的输出以 0 为中心。

缺点: Tanh 函数依旧存在由于饱和性产生的梯度消失问题。

ReLU 函数

ReLU 函数的数学形式如下:

y=\begin{cases} 0\quad (x\leq 0)\\\\ x\quad (x>0) \end{cases}

其对应的图像如图3所示:


图3 ReLU 函数图像

 

优点:

  1. Sigmoid 和 Tanh 函数涉及了消耗很大的操作(比如指数),ReLU 可以更加简单的实现。
  2. ReLU 函数有效的缓解了梯度消失问题。
  3. ReLU 函数在没有无监督预训练的时候也能有较好的表现。

缺点:

随着训练的进行,可能权重无法更新的情况。

对于实现 ReLU 函数,可以尝试使用numpy.where(arr,a,b),具体使用可以参考numpy.where()使用方法。

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成 Sigmoid 函数、Tanh 函数以及 Relu 函数的编写,只有三个函数同时正确时,才能提交成功。

测试说明

平台会对你编写的代码进行测试:

测试输入:无

预期输出:

True


开始你的任务吧,祝你成功!

import numpy as np

class ActivationFunction(object):
    def sigmoid(self,x):
        """
        Sigmoid 函数
        :param x: 函数的输入,类型为list
        :return: y, 函数的计算结果
        """
        ########## Begin ##########
        y = 1/(1+np.exp(-x))
        ########## End ##########
        return y

    def tanh(self,x):
        """
        Tanh 函数
        :param x: 函数的输入,类型为list
        :return: y, 函数的计算结果
        """
        ########## Begin ##########
        y = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
        ########## End ##########
        return y

    def ReLU(self,x):
        """
        ReLU 函数
        :param x: 函数的输入,类型为list
        :return: y, 函数的计算结果
        """
        ########## Begin ##########
        y = np.where(x>0,x,0)
        ########## End ##########
        return y

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畜牧当道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值