Coursera deeplearning.ai 深度学习笔记1-4-Deep Neural Networks-深度神经网络原理推导与代码实现
2017-12-12 19:52
1096 查看
在掌握了浅层神经网络算法后,对深度神经网络进行学习。
z[l]=W[l]a[l−1]+b[l],a[l]=g[l](z[l])(1)
式中,g[l](z[l])为第l层的激活函数,且a[0] = x。针对m个样本,以上标(m)表示第m个样本,将上式改写为:
Z[l]=W[l]A[l−1]+b[l],A[l]=g[l](Z[l])(2)
式中,A[0] = X,
Z[l]=⎡⎣⎢|z[l](1)||z[l](2)||⋯||z[l](m)|⎤⎦⎥,A[l]=⎡⎣⎢|a[l](1)||a[l](2)||⋯||a[l](m)|⎤⎦⎥(3)
因此,对于以上L层深度神经网络,给定A[0] = X,正向传播计算流程如下:
A[0]=Xforiinrange(1,L+1):Z[l]=W[l]A[l−1]+b[l]A[l]=g[l](Z[l])(4)
正向传播,实际就是输入A[l-1]得到A[l]的过程,同时需要将Z[l]保存以便于反向传播的计算。
各矩阵维度如下表:
dz[l]=da[l]∗g[l]′(z[l])dW[l]=dz[l]a[l−1]Tdb[l]=dz[l]da[l−1]=W[l]Tdz[l](5)
式中,“*”表示元素点乘。拓展到m个样本得到:
dZ[l]=dA[l]∗g[l]′(Z[l])dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](6)
通过上式便可求出梯度dW和db。
反向传播,实际就是输入dA[l]得到dA[l-1]以及梯度dW[l]和db[l]的过程,同时需要将dZ[l]保存以方便计算。
反向传播的初始化如下。由于损失函数表示为:
L(a,y)=−[yloga+(1−y)log(1−a)](7)
则可以求出:
da[L]=dda[L]{−[yloga[L]+(1−y)log(1−a[L])]}=−ya[L]+1−y1−a[L]dA[L]=⎡⎣⎢⎢|−y(1)a[L](1)+1−y(1)1−a[L](1)||−y(2)a[L](2)+1−y(2)1−a[L](2)||⋯||−y(m)a[L](m)+1−y(m)1−a[L](m)|⎤⎦⎥⎥(8)
在反向传播过程中,同样可以求出代价函数如下:
J(w,b)=1m∑i=1mL(a(i),y(i))=−1m∑i=1m[y(i)loga(i)+(1−y(i))log(1−a(i))](9)
W[l]=W[l]−αdW[l]b[l]=b[l]−αdb[l](10)
(1) 学习因子α;
(2) 迭代次数iterations;
(3) 隐含层数量L;
(4) 隐含层单元数量n[1], n[2], … , n[L];
(5) 激活函数的选择。
其他超参数:momentum、mini batch size、regularization parameters等。
各个模块如下:
Z[l]=W[l]A[l−1]+b[l](11)
核心代码如下:
A[l]=g[l](Z[l])(12)
核心代码如下:
dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](13)
核心代码如下:
dZ[l]=dA[l]∗g[l]′(Z[l])(14)
核心代码如下:
得到如下结果。可以看出,代价函数随着迭代次数的增加不断下降,训练样本准确率98.56%,测试样本的准确率80%。
以下代码输出预测错误的图片。
结果如下:
可以看出,该模型对于具备以下特征的图片的分类较为困难:
(1) 猫咪身体位置较偏;
(2) 猫咪与背景颜色相似;
(3) 品种少见的猫咪;
(4) 相机角度特殊;
(5) 图片亮度较差;
(6) 猫咪在图片中太大或者太小。
代码下载地址:https://gitee.com/tuzhen301/Coursera-deeplearning.ai1-4
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层,针对单个样本,正向传播可以表示为:z[l]=W[l]a[l−1]+b[l],a[l]=g[l](z[l])(1)
式中,g[l](z[l])为第l层的激活函数,且a[0] = x。针对m个样本,以上标(m)表示第m个样本,将上式改写为:
Z[l]=W[l]A[l−1]+b[l],A[l]=g[l](Z[l])(2)
式中,A[0] = X,
Z[l]=⎡⎣⎢|z[l](1)||z[l](2)||⋯||z[l](m)|⎤⎦⎥,A[l]=⎡⎣⎢|a[l](1)||a[l](2)||⋯||a[l](m)|⎤⎦⎥(3)
因此,对于以上L层深度神经网络,给定A[0] = X,正向传播计算流程如下:
A[0]=Xforiinrange(1,L+1):Z[l]=W[l]A[l−1]+b[l]A[l]=g[l](Z[l])(4)
正向传播,实际就是输入A[l-1]得到A[l]的过程,同时需要将Z[l]保存以便于反向传播的计算。
各矩阵维度如下表:
矩阵 | A[0] = X | A[l] | W[l] | b[l] | Z[l] |
---|---|---|---|---|---|
维度 | (n[0], m) | (n[l], m) | (n[l], n[l-1]) | (n[l], 1) | (n[l], m) |
1.3 反向传播(Backward Propagation)
类似浅层神经网络的推导可以得到,对于第l层,针对单个样本,反向传播可以表示为:dz[l]=da[l]∗g[l]′(z[l])dW[l]=dz[l]a[l−1]Tdb[l]=dz[l]da[l−1]=W[l]Tdz[l](5)
式中,“*”表示元素点乘。拓展到m个样本得到:
dZ[l]=dA[l]∗g[l]′(Z[l])dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](6)
通过上式便可求出梯度dW和db。
反向传播,实际就是输入dA[l]得到dA[l-1]以及梯度dW[l]和db[l]的过程,同时需要将dZ[l]保存以方便计算。
反向传播的初始化如下。由于损失函数表示为:
L(a,y)=−[yloga+(1−y)log(1−a)](7)
则可以求出:
da[L]=dda[L]{−[yloga[L]+(1−y)log(1−a[L])]}=−ya[L]+1−y1−a[L]dA[L]=⎡⎣⎢⎢|−y(1)a[L](1)+1−y(1)1−a[L](1)||−y(2)a[L](2)+1−y(2)1−a[L](2)||⋯||−y(m)a[L](m)+1−y(m)1−a[L](m)|⎤⎦⎥⎥(8)
在反向传播过程中,同样可以求出代价函数如下:
J(w,b)=1m∑i=1mL(a(i),y(i))=−1m∑i=1m[y(i)loga(i)+(1−y(i))log(1−a(i))](9)
1.4 梯度下降(Gradient Descent)
通过反向传播求出了梯度dW和db后,即可用梯度下降法对参数进行更新:W[l]=W[l]−αdW[l]b[l]=b[l]−αdb[l](10)
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
采用下式,实现每个节点的线性部分:Z[l]=W[l]A[l−1]+b[l](11)
核心代码如下:
2.2.2 线性激活部分linear_activation_forward
采用下式,实现sigmoid和ReLU函数的线性激活部分:A[l]=g[l](Z[l])(12)
核心代码如下:
2.2.3 正向传播forward
利用以上两个函数,实现[Linear -> ReLU](*L - 1) -> [Linear -> Sigmoid]的正向传播过程,核心代码如下:2.3 计算代价函数compute_cost
核心代码如下:2.4 反向传播
2.4.1 线性部分linear_backward
采用下式,实现每个节点的线性部分:dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](13)
核心代码如下:
2.4.2 线性激活部分linear_activation_backward
采用下式实现sigmoid和ReLU函数的线性激活部分,dZ[l]=dA[l]∗g[l]′(Z[l])(14)
核心代码如下:
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
相关文章推荐
- Coursera deeplearning.ai 深度学习笔记1-3-Shallow Neural Networks-浅层神经网络原理推导与代码实现
- Coursera deeplearning.ai 深度学习笔记2-1-Practical aspects of deep learning-神经网络实际问题分析(初始化&正则化&训练效率)与代码实现
- Coursera deeplearning.ai 深度学习笔记1-2-Neural Network Basics-逻辑回归原理推导与代码实现
- Coursera deeplearning.ai 深度学习笔记4-1-Foundations of Convolutional Neural Networks-卷积神经网络基础及代码实现
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-4)-- 深层神经网络(转载)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络(转载)
- Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-2)-- 神经网络基础
- Coursera深度学习课程DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络
- Coursera deeplearning.ai 深度学习笔记4-2-Deep Convolutional Models Case Studies-深度卷积模型案例及代码实现
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-2)-- 神经网络基础(转载)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-4)-- 深层神经网络
- Coursera deeplearning.ai 深度学习笔记2-2-Optimization algorithms-优化算法与代码实现
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-2)-- 神经网络基础
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-2)-- 神经网络基础
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
- [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.10_1.12/梯度消失/梯度爆炸/权重初始化
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络
- 深度学习DeepLearning.ai系列课程学习总结:3. Python矢量化实现神经网络
- [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈
- Deep Q-Network 学习笔记(二)—— Q-Learning与神经网络结合使用(有代码实现)