美文网首页
第三章-神经网络-激活函数

第三章-神经网络-激活函数

作者: 风清云淡Python | 来源:发表于2018-11-27 21:43 被阅读0次

    激活函数

    (1)阶跃函数

    当输入超过0时,输出1,否则输出0

    def step_function(x):
        if x > 0:
            return 1
        else:
            return 0
    

    但是,这个函数的缺陷在于函数的输入参数只能是一个数值,而不能是NumPy数组

    改进
    import numpy as np
    x = np.array([-1.23,2.566,3.3344])
    # 对NumPy进行不等号运算
    y = x > 0
    print(y)
    # astype()函数用来转换NumPy数组的类型
    y = x.astype(np.int)
    print(y)
    

    astype()函数用来转换NumPy数组的类型
    对NumPy进行不等号运算

    阶跃函数的代码实现
    # coding: utf-8
    import numpy as np
    import matplotlib.pylab as plt
    
    def step_function(x):
        return np.array(x > 0, dtype=np.int)
    
    X = np.arange(-5.0, 5.0, 0.1)#从-5到5,步长为0.1
    Y = step_function(X)#给阶跃函数传进NumPy数组,对每个元素做不等号运算,再以int类型输出。
    plt.plot(X, Y)
    plt.ylim(-0.1, 1.1)  # 指定图中绘制的y轴的范围
    plt.show()
    

    np.arange(-5.0, 5.0, 0.1)#从-5到5,步长为0.1
    ylim(-0.1, 1.1) # 指定图中绘制的y轴的范围

    阶跃函数

    (2)sigmoid函数

    sigmoid函数作为激活函数
    其公式为:


    sigmoid function

    sigmoid 函数的实现代码:

    # coding: utf-8
    import numpy as np
    import matplotlib.pylab as plt
    
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))    
    
    X = np.arange(-5.0, 5.0, 0.1)
    Y = sigmoid(X)
    plt.plot(X, Y)
    plt.ylim(-0.1, 1.1)
    plt.show()
    

    当输入的x是NumPy数组时,结果也能被正确计算,因为 np.exp(-x)会生成一个NumPy数组,用到了NumPy的广播功能。

    (3)阶跃函数与sigmoid函数的比较

    # coding: utf-8
    import numpy as np
    import matplotlib.pylab as plt
    
    
    def sigmoid(x):
       return 1 / (1 + np.exp(-x))    
    
    
    def step_function(x):
       return np.array(x > 0, dtype=np.int)
    
    x = np.arange(-5.0, 5.0, 0.1)
    y1 = sigmoid(x)
    y2 = step_function(x)
    
    plt.plot(x, y1, label="sigmoid")
    plt.plot(x, y2, 'k--', label="step")
    plt.ylim(-0.1, 1.1) #指定图中绘制的y轴的范围
    plt.title('step function & sigmoid function')
    plt.legend()#用于显示各条线对应的label
    plt.show()
    
    image.png

    (1)sigmoid函数的平滑性对神经网络的学习具有重要意义。
    (2)这两个函数的取值范围都在0-1之间
    (3)两个函数都是非线性函数

    神经网络中的激活函数必须是非线性函数,否则使用线性函数,加深神经网络的层数就没有意义了。

    eg:有个三层的神经网络,激活函数为:h(x)=cx, y(x)=h(h(h(x)))=cccx=c^3x.

    为了发挥多层神经网络带来的优势,激活函数必须使用非线性函数。

    问题:为什么神经网络的层数多一些会好?

    答:不是说仅仅层数越多效果越好,这个还取决于你的激活函数,还有各种超参数的设置等等。同意 @Eslavill 的观点,层数多了,网络表达能力更强了,第一层学习个直线,第二层学习个基本的几何图形,第三层再学习个更复杂的图形。

    (4)ReLU函数(Rectified Linear Unit)

    ReLU函数在输入大于0的时候,直接输出该值,在输入小于等于0时,输出0.
    ReLU函数的公式为:


    ReLU函数的实现代码

    # coding: utf-8
    import numpy as np
    import matplotlib.pylab as plt
    
    def relu(x):
        return np.maximum(0, x)
    
    x = np.arange(-5.0, 5.0, 0.1)
    y = relu(x)
    plt.plot(x, y, label="ReLU")
    plt.ylim(-1.0, 5.5) #指定图中绘制的y轴的范围
    plt.title('ReLU')
    plt.legend()#用于显示各条线对应的label
    plt.show()
    

    这里使用了NumPy的maximum()函数,该函数会从输入的数值中选择较大的那个进行输出。

    相关文章

      网友评论

          本文标题:第三章-神经网络-激活函数

          本文链接:https://www.haomeiwen.com/subject/jqbwqqtx.html