本文是Deep Learning Specialization系列课程的第1课《Neural Networks and Deep Learning》中Deep Neural Network练习部分的学习笔记。
上一篇文章《07 深度神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]》对深度神经网络涉及到的公式进行了推到,这篇文章则主要是通过NumPy来将其实现。
深度神经网络的框架
首先从整体上对深度神经网络的框架做一个梳理,主要是包含5个步骤:
- 初始化L层神经网络的参数
- 正向传播
- 在正向传播中,包含3部分,首先是实现Linear函数,
- 再通过给定的ReLU和Sigmoid函数来,构成Linear-Activation函数
- Linear-ReLU函数用作前L-1层,最后输出层使用Linear-Sigmoid函数
- 损失函数(代价函数)
- 反向传播
- 反向传播与正向传播的计算类似,也是先实现反向传播中的Linear函数部分
- 再根据给定的ReLU和Sigmoid函数的梯度,构成Linear-Activation的反向传播函数
- 最后是输出层的Linear-Sigmoid反向传播函数和前L-1层的Linear-ReLU反向传播函数
- 更新参数
下面这张图做了很好的说明:
1. 初始化参数
在前面的练习中,针对2层神经网络,其参数的初始化为:
def initialize_parameters(n_x, n_h, n_y):
W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros((n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros((n_y, 1))
parameters = {
"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2
}
return parameters
对L层的神经网络,在初始化参数时,需要注意网络的层数以及各层网络的维度。这里引入一个layer_dims
,即包含每层网络的维度信息的列表,最终参数初始化的过程为:
def initialize_parameters_deep(layer_dims):
paramters = {}
L = len(layer_dims)
for l in range(1, L):
paramters["W" + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
paramters["b" + str(l)] = np.zeros((layer_dims[l], 1))
return paramters
2. 正向传播
正向传播包含三部分:
- LINEAR
- LINEAR -> ACTIVATION,其中ACTIVATION是ReLU或Sigmoid函数
- [LINEAR -> RELU] × \times × (L-1) -> LINEAR -> SIGMOID 完成整个模型
2.1 LINEAR
线性函数为: Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] Z^{[l]} = W^{[l]}A^{[l-1]} +b^{[l]} Z[l]=W[l]A[l−1]+b[l],其中 A [ 0 ] = X A^{[0]} = X A[0]=X。
实现很简单,但要注意需要将计算用到的参数作为cache输出,主要是为反向传播计算中使用:
def linear_forward(A, W, b):
Z = np.dot(W, A) + b
cache = (A, W, b)
return Z, cache
2.2 LINEAR -> ACTIVATION
这里分两部分,前L-1层时使用ReLU激活函数,输出层是使用Sigmoid激活函数。
- ReLu: A = r e l u ( Z ) = m a x ( 0 , Z ) A = relu(Z) = max(0, Z) A=relu(Z)=max(0,Z)
- Sigmoid: σ ( Z ) = σ ( W A + b ) = 1 1 + e − ( W A + b ) \sigma(Z) = \sigma(W A + b) = \frac{1}{ 1 + e^{-(W A + b)}} σ(Z)=σ(WA+b)=1+e−(WA+b)1
在计算时,采用该算式: A [ l ] =