深度BP神经网络
前言
学习了深度BP神经网络的demo,该demo中神经网络总共大于两层,隐藏层任意,每层神经元任意,输出层1层,1个神经元。
一、设置参数
- 训练集图片大小 64*64
- 训练集 特征数据X(n,64,64,3)
- X = X.reshape(X, -1).T 转换为标准化参数X X(12288,1)
- 标签数据Y(1,n)
- 测试集 同上X
- 权重数组W
- 置值 b
- 学习率 r
- 样本数 n
- 神经网络层数layers_dims (12288, 20, 7, 5, 1)
二、涉及算法步骤
1.初始化W,b
# 随机初始化所有层相关的参数W和b
def initialize_parameters_deep(layer_dims): #该函数用于初始化所有层的参数w和b
#layer_dims – 该参数是个list列表,里面包含了每层的神经元个数。
return parameters #返回所有层的W和b
2.前向传播
# 下面为线性前向传播
def linear_forward(A, W, b):# A–前一层计算出的A
return Z, cache # 返回该层最终结果的Z和该层所用到的A_prev,W, b
# linear_activation_forward 使Z通过激活函数转化成A,使用了激活函数之后上面的线性前向传播就变成了非线性前向传播了
def linear_activation_forward(A_prev, W, b, activation):
# activation – 两个字符串,“sigmoid"或"relu”,指示该层应该使用哪种激活函数
return A, cache # 返回转化以后的A, 该层所用到的((A_prev,W, b), Z)
# 下面函数构建了一个完整的前向传播过程。这个前向传播一共有L层,前面的L-1层用的激活函数是relu,最后一层使用sigmoid。
def L_model_forward(X, parameters):# 初始输入数据X,存放所有层的W和b
return AL, caches #得出的AL就是y’预测值, caches存放了每层所用到的((A_prev,W, b), Z)
3.计算成本
# 通过每次训练的成本我们就可以知道当前神经网络学习的程度好坏。
def compute_cost(AL, Y):# 最终计算结果AL, 标签数据Y
return cost # 得到该次前像传播的成本
4.反向传播
#linear_backward函数通过用本层的dZ算出本层的dW和db以及前一层的dA
def linear_backward(dZ, cache): # cache包含前一层的A_prev, 该层的W和b
return dA_prev, dW, db # 得出前一层的dA,本层的dW和db
#linear_activation_backward函数根据本层的dA计算出本层的dZ。
def linear_activation_backward(dA, cache, activation):
# dA – 本层的dA,cache – 前向传播时保存的本层所用到的((A_prev,W, b), Z
return dA_prev, dW, db
# 通过算出的dZ和参数cache中的A_prev,W, b传入linear_backward函数,最终得到前一层的dA_prev,该层的dW和db
# 下面这个函数构建出整个反向传播。
def L_model_backward(AL, Y, caches):
#AL – 最后一层的A,也就是y’, cache – 前向传播时保存的本层所用到的((A_prev,W, b), Z)
return grads #将每层的dW和db,和该层前一层的dA_prev, 存入字典grads中
5.梯度下降
# update_parameters函数将利用grad中的梯度来更新/优化每一层的w和b,也就是进行梯度下降。
def update_parameters(parameters, grads, learning_rate):
return parameters #更新parameters字典中的W和b
6.数据预测
#预测其实就是简单地执行一次前向传播
def predict(X,parameters):
#x—测试数据集,parameters—经过模型的得到的parameters字典中的W和b
return p #返回所有预测结果的标签集
总结
经过测试集可以得出深度神经网络的准确率确实比单神经元网络有所提升。