深度学习入门:基于 Python 的理论与实现 (8):神经网络 3.2.4

阅读数:25 2019 年 11 月 13 日 15:01

深度学习入门:基于Python的理论与实现(8):神经网络 3.2.4

内容简介
本书是深度学习真正意义上的入门书,深入浅出地剖析了深度学习的原理和相关技术。书中使用 Python3,尽量不依赖外部库或工具,从基本的数学知识出发,带领读者从零创建一个经典的深度学习网络,使读者在此过程中逐步理解深度学习。书中不仅介绍了深度学习和神经网络的概念、特征等基础知识,对误差反向传播法、卷积神经网络等也有深入讲解,此外还介绍了深度学习相关的实用技巧,自动驾驶、图像生成、强化学习等方面的应用,以及为什么加深层可以提高识别精度等疑难的问题。
本书适合深度学习初学者阅读,也可作为高校教材使用。

(sigmoid 函数的实现)

下面,我们来实现 sigmoid 函数。用 Python 可以像下面这样写出式(3.6)表示的 sigmoid 函数。

复制代码
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

这里,np.exp(-x) 对应 $\exp(-x)$。这个实现没有什么特别难的地方,但是要注意参数 x 为 NumPy 数组时,结果也能被正确计算。实际上,如果在这个 sigmoid 函数中输入一个 NumPy 数组,则结果如下所示。

>>> x = np.array([-1.0, 1.0, 2.0])
>>> sigmoid(x)
array([ 0.26894142,  0.73105858,  0.88079708])

之所以 sigmoid 函数的实现能支持 NumPy 数组,秘密就在于 NumPy 的广播功能(1.5.5 节)。根据 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])

在这个例子中,标量(例子中是 1.0)和 NumPy 数组之间进行了数值运算(+、/ 等)。结果,标量和 NumPy 数组的各个元素进行了运算,运算结果以 NumPy 数组的形式被输出。刚才的 sigmoid 函数的实现也是如此,因为 np.exp(-x) 会生成 NumPy 数组,所以 1 / (1 + np.exp(-x)) 的运算将会在 NumPy 数组的各个元素间进行。

下面我们把 sigmoid 函数画在图上。画图的代码和刚才的阶跃函数的代码几乎是一样的,唯一不同的地方是把输出 y 的函数换成了 sigmoid 函数。

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

运行上面的代码,可以得到图 3-7。

评论

发布