深度学习入门(三)------- 阶跃函数和Sigmoid函数

引入了一个新概念叫阶跃函数,阶跃函数以0为界,输出从0切换为1(或者从1切换为0),它的值呈阶梯式变化,所以称为阶跃函数。

它的图形代码就是:

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)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)    # 指定y轴的范围
plt.show()

np.arange(-5.0, 5.0, 0.1)在-5.0到5.0的范围内,以0.1为单位,生成NumPy数组([-5.0, -4.9, , 4.9])。step_function()以该NumPy数组为参数,对数组的各个元素执行阶跃函数运算,并以数组形式返回运算结果。np.int型,Python中将布尔型转换为int型后,True会转换为1,False会转换为0。对数组x、y进行绘图

深度学习入门(三)------- 阶跃函数和Sigmoid函数_第1张图片

 在说sigmoid函数之前,先说一下NumPy 的广播功能,如果在标量和NumPy数组之间进行运算,则标量会和NumPy数组的各个元素进行运算。像乘法里的结合率一样,大概可以这么理解,例如:

>>> t = np.array([1.0, 2.0, 3.0])
>>> 1.0 + t
array([ 2., 3., 4.])

>>> 1.0 / t
array([ 1. , 0.5 , 0.33333333])

用Python写出式表示的sigmoid函数:

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

我们把sigmoid函数画在图上:

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) # 指定y轴的范围
plt.show()

深度学习入门(三)------- 阶跃函数和Sigmoid函数_第2张图片

 Sigmoid函数和阶跃函数的不同是:

1.“平滑性”的不同。sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。

2.另一个不同点是,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 ...、0.880 …等实数。

在我理解,说了这么多就是说明了激活函数必须使用非线性函数。在这里有点跳,作者的本意是在上面介绍了Sigmoid函数和阶跃函数的非线性函数,说明了使用线性函数的话,会导致加深神经网络的层数就没有意义了。线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。为了具体地(稍微直观地)理解这一点,我们来思考下面这个简单的例子。这里我们考虑把线性函数 h(x) = cx 作为激活函数,把y(x) = h(h(h(x)))的运算对应3层神经网络A。这个运算会进行y(x) = c × c × c × x的乘法运算,但是同样的处理可以由y(x) = ax(注意,a = c 的三次方)这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。

注:以上的学习内容均来自《深度学习入门》[斋藤康毅]著

你可能感兴趣的:(深度学习,numpy,python)