目录
4.1 Building your Deep Neural Network: Step by Step
4 - Forward propagation module
4.2 - Linear-Activation Forward
6 - Backward propagation module
6.2 - Linear-Activation backward
4.2 Deep Neural Network for Image Classification: Application
3 - Architecture of your model
3.2 - L-layer deep neural network
7 - Test with your own image (optional/ungraded exercise)
4.1 Building your Deep Neural Network: Step by Step
符号:
- 上标[l]表示第l层,例如:
是第L层的激活函数,
和
是第L层的参数。
- 上标(i)表示第i个样本,例如:
是第i个训练样本。
- 下标i表示向量的第i个输入,例如:
表示第l层激活函数的第i个输入。
1 - Packages
首先,运行下面的单元来导入在这个作业中需要的所有包:
- numpy是使用python进行科学计算的基础包。
- Matplotlib是一个用于在Python中绘制图形的库。
- dnn_utils提供了一些必要的函数。
- testCases提供了一些测试用例来评估函数的正确性。
- np.random.seed(1)用来保持所有的随机函数调用的一致性。
import numpy as np
import h5py
import matplotlib.pyplot as plt
from testCases_v2 import *
from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward
%matplotlib inline
plt.rcParams['figure.figsize'] = (5.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
%load_ext autoreload
%autoreload 2
np.random.seed(1)
2 - Outline of the Assignment
为了构建神经网络,需要实现几个辅助函数。这些辅助函数将在下节作业中用来构造一个双层神经网络和一个L层的神经网络。下面是任务大纲:
1.初始化双层神经网络和L层神经网络的参数
2.实现前向传播模块(紫色部分):
- 完成一步前向传播的LINEAR部分(得到
)
- 已有ACTIVATION函数(relu/sigmoid)
- 合并前两步,得到新的[LINEAR→ACTIVATION]前向函数
- 堆叠[LINEAR→RELU]前向函数L-1次(从第1层到第L-1层),在最后(最后一层L)加上一个[LINEAR→RELU]。得到新的L_model_forward函数。
3.计算损失
4.实现反向传播模块(红色部分):
- 完成一步反向传播的LINEAR部分
- 已有ACTIVATE函数的梯度(relu_backward/sigmoid_backward)
- 合并前两部,得到新的[LINEAR→ACTIVATION]反向函数
- 堆叠[LINEAR→RELU]反向函数L-1次,加上[LINEAR→SIGMOID],得到新的L_model_backward函数。
5.最后更新参数
注意:对于每一个前向函数,都有一个对应的反向函数,这就是为什么前向模块的每一步都要存储一些值在一个缓存器中,在反向传播模块你会用到这些缓存值来计算梯度。
3 - Initialization
完成两个辅助函数来初始化模型的参数,第一个函数初始化双层神经网络的参数,第二个函数初始化L层神经网络的参数。
3.1 - 2-layer Neural Network
练习:创建并初始化双层神经网络的参数。
说明:
- 模型的结构是LINEAR→RELU→LINEAR→SIGMOID
- 对于权重矩阵使用随机初始化,使用正确维度的np.random.randn(shape)*0.01
- 对于偏置值初始化为零,使用np.zeros(shape)
W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1))
3.2 - L-layer Neural Network
是l层的神经元数目,如果输入X的大小是(12288,209),即209个样本数:
练习:实现L层神经网络的初始化。
说明:
- 模型的结构是[LINEAR→RELU] X (L-1) → LINEAR → SIGMOID,即有L-1层使用RELU激活函数,接着是一个输出层使用sigmoid激活函数。
- 对于权重矩阵使用随机初始化,使用np.random.randn(shape)*0.01
- 对于偏置值初始化为零,使用np.zeros(shape)
- 对于不同层的神经元数目
,将其存在变量layer_dims中。例如,在“Planar Data classification model”中,layer_dims就是[2,4,1]:两个输入单元,单隐层有四个隐藏单元,输出层有有一个输出单元。意味着W1的大小是(4,2),b1的大小是(4,1),W2的大小的(1,4),b2的大小是(1,1)。
np.random.seed(3)
parameters = {}
L = len(layer_dims) # number of layers in the network
for l in range(1, L):
parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
parameters['b' + str(l)] = np.zeros(shape=(layer_dims[l], 1))
4 - Forward propagation module
4.1 - Linear Forward
首先实现三个函数:
- LINEAR
- LINEAR → ACTIVATION,其中ACTIVATION是RELU或sigmoid
- [LINEAR → RELU] X (L-1) → LINEAR → SIGMOID(整个模型)
线性前向模块计算如下:
其中,
练习:构建前向传播的线性模块。
Z = np.dot(W, A) + b
4.2 - Linear-Activation Forward
两个激活函数Sigmoid和ReLU,都返回两个值,激活值"a",一个"cache"包含了"Z"(将反馈给相应的反向函数的值)。
练习:实现LINEAR→ACTIVATION层的前向传播,数学表示为,使用linear_forward()和正确的激活函数。
if activation == "sigmoid":
# Inputs: "A_prev, W, b". Outputs: "A, activation_cache".
Z, linear_cache = linear_forward(A_prev, W, b)
A, activation_cache = sigmoid(Z)
elif activation == "relu":
# Inputs: "A_prev, W, b". Outputs: "A, activation_cache".
Z, linear_cache = linear_forward(A_prev, W, b)
A, activation_cache = relu(Z)
4.3 - L-Layer Model
为了更方便地实现L层神经网络,需要一个函数来复制上一步(linear_activation_forward和RELU)L-1次,然后紧接着是linear_activation_forward和SIGMOID。