在掌握了浅层神经网络算法后,对深度神经网络进行学习。
1. 原理推导
1.1 深度神经网络表示
定义:L表示神经网络总层数,上标[l]代表第l层网络,n[l]代表第l层的节点数,a[l]代表第l层的激活,W[l]和b[l]为第l层的参数。输入层为第0层a[0] = x,输出层为第L层a[L]。
1.2 正向传播(Forward Propagation)
类似浅层神经网络的推导可以得到,对于第l层,针对单个样本,正向传播可以表示为:
式中,g[l](z[l])为第l层的激活函数,且a[0] = x。针对m个样本,以上标(m)表示第m个样本,将上式改写为:
式中,A[0] = X,
因此,对于以上L层深度神经网络,给定A[0] = X,正向传播计算流程如下:
正向传播,实际就是输入A[l-1]得到A[l]的过程,同时需要将Z[l]保存以便于反向传播的计算。
各矩阵维度如下表:
|
|
|
|
|
|
---|---|---|---|---|---|
|
|
|
|
|
|
1.3 反向传播(Backward Propagation)
类似浅层神经网络的推导可以得到,对于第l层,针对单个样本,反向传播可以表示为:
式中,“*”表示元素点乘。拓展到m个样本得到:
通过上式便可求出梯度dW和db。
反向传播,实际就是输入dA[l]得到dA[l-1]以及梯度dW[l]和db[l]的过程,同时需要将dZ[l]保存以方便计算。
反向传播的初始化如下。由于损失函数表示为:
则可以求出:
在反向传播过程中,同样可以求出代价函数如下:
1.4 梯度下降(Gradient Descent)
通过反向传播求出了梯度dW和db后,即可用梯度下降法对参数进行更新:
1.5 超参数(Hyperparameters)
深度神经网络中主要有以下几个超参数需要调整:
(1) 学习因子α;
(2) 迭代次数iterations;
(3) 隐含层数量L;
(4) 隐含层单元数量n[1], n[2], … , n[L];
(5) 激活函数的选择。
其他超参数:momentum、mini batch size、regularization parameters等。
2. 代码实现
案例:采用L层深度神经网络,实现猫咪图片的二分类。
各个模块如下:
2.1 初始化initialize
对W随机初始化,并将b初始化为0,核心代码如下:
2.2 正向传播
2.2.1 线性部分linear_forward
采用下式,实现每个节点的线性部分:
核心代码如下:
2.2.2 线性激活部分linear_activation_forward
采用下式,实现sigmoid和ReLU函数的线性激活部分:
核心代码如下:
2.2.3 正向传播forward
利用以上两个函数,实现[Linear -> ReLU](*L - 1) -> [Linear -> Sigmoid]的正向传播过程,核心代码如下:
2.3 计算代价函数compute_cost
核心代码如下:
2.4 反向传播
2.4.1 线性部分linear_backward
采用下式,实现每个节点的线性部分:
核心代码如下:
2.4.2 线性激活部分linear_activation_backward
采用下式实现sigmoid和ReLU函数的线性激活部分,
核心代码如下:
2.4.3 正向传播backward
利用以上两个函数,实现[Linear -> ReLU](*L - 1) -> [Linear -> Sigmoid]的正向传播过程,核心代码如下:
2.5 参数更新update_parameters
利用梯度下降法对参数进行更新,核心代码如下:
2.6 模型构建dnn_model
将上述几个模块组合起来,得到最优参数W和b,核心代码如下:
2.7 样本预测predict
输入样本,利用模型预测样本并计算预测准确率,核心代码如下:
2.8 样本测试
核心代码如下:
得到如下结果。可以看出,代价函数随着迭代次数的增加不断下降,训练样本准确率98.56%,测试样本的准确率80%。
以下代码输出预测错误的图片。
结果如下:
可以看出,该模型对于具备以下特征的图片的分类较为困难:
(1) 猫咪身体位置较偏;
(2) 猫咪与背景颜色相似;
(3) 品种少见的猫咪;
(4) 相机角度特殊;
(5) 图片亮度较差;
(6) 猫咪在图片中太大或者太小。
代码下载地址:https://gitee.com/tuzhen301/Coursera-deeplearning.ai1-4