构建神经网络(第四章)==代码思路分析

784 阅读4分钟

一、[LINEAR-> ACTIVATION]转发函数

比如我有一个多层的神经网络,结构是输入层->隐藏层->隐藏层->···->隐藏层->输出层。

在每一层中,我会首先计算Z = np.dot(W,A) + b,这叫做【linear_forward】

然后再计算A = relu(Z) 或者 A = sigmoid(Z),这叫做【linear_activation_forward】

合并起来就是这一层的计算方法,所以每一层的计算都有两个步骤,先是计算Z,再计算A,你也可以参照下图:

image.png

二、步骤:

1.初始化网络参数

2.前向传播

2.1 计算一层的中线性求和的部分

2.2 计算激活函数的部分(ReLU使用L-1次,Sigmod使用1次)

2.3 结合线性求和与激活函数

3.计算误差

4.反向传播

4.1 线性部分的反向传播公式

4.2 激活函数部分的反向传播公式

4.3 结合线性部分与激活函数的反向传播公式

5.更新参数

  请注意,对于每个前向函数,都有一个相应的后向函数。 这就是为什么在我们的转发模块的每一步都会在cache中存储一些值,cache的值对计算梯度很有用, 在反向传播模块中,我们将使用cache来计算梯度。 现在我们正式开始分别构建两层神经网络和多层神经网络。 代码见D:\app\pyCharm\pyCharm\pycharmproject\homework\WUEnda\Four

三、代码详解:

1.初始化参数

输入层节点3,隐藏层节点2,输出层节点1

L=2即两层的神经网络:w1w2/b1b2

多层神经网络:initialize_parameters_deep(layers_dims), layers_dims - 包含我们网络中每个图层的节点数量的列表

2.前向传播函数

前向传播有以下三个步骤:

1.LINEAR

2.LINEAR - >ACTIVATION,其中激活函数将会使用ReLU或Sigmoid。

3.[LINEAR - > RELU] ×(L-1) - > LINEAR - > SIGMOID(整个模型)

线性正向传播模块(向量化所有示例)使用如下公式进行计算: image.png

1.线性部分【LINEAR】

利用输入的A、W、b来计算 Z = np.dot(W, A) + b,并输出Z和Cache

2.线性激活部分【LINEAR - >ACTIVATION】计算如下:

为了更方便,我们将把两个功能(线性和激活)分组为一个功能(LINEAR-> ACTIVATION)。 因此,我们将实现一个执行LINEAR前进步骤,然后执行ACTIVATION前进步骤的功能。我们来看看这激活函数的数学实现吧~ image.png

我们为了实现LINEAR->ACTIVATION这个步骤, 使用的公式是:

A^{[l]} = g(Z^{[l]}) = g(W^{[l]}A^{[l-1]} +b^{[l]})

其中,函数g会是sigmoid() 或者是 relu(),当然,sigmoid()只在输出层使用。

代码: 我们调用上面的那两个函数来实现它,为了在实现L层神经网络时更加方便,我们需要一个函数来复制前一个函数(带有RELU的linear_activation_forward)L-1次,然后用一个带有SIGMOID的linear_activation_forward跟踪它,我们来看一下它的结构是怎样的:

image.png [LINEAR -> RELU] ×\times (L-1) -> LINEAR -> SIGMOID* model

3.计算成本(误差)

我们已经把这两个模型的前向传播部分完成了,我们需要计算成本(误差),以确定它到底有没有在学习,成本的计算公式如下:

image.png

4.反向传播

反向传播用于计算相对于参数的损失函数的梯度,我们来看看向前和向后传播的流程图:

image.png

流程图有了,我们再来看一看对于线性的部分的公式:

image.png

image.png 与前向传播类似,我们有需要使用三个步骤来构建反向传播:

1.LINEAR 后向计算

2.LINEAR -> ACTIVATION 后向计算,其中ACTIVATION 计算Relu或者Sigmoid 的结果

3.[LINEAR -> RELU] × \times× (L-1) -> LINEAR -> SIGMOID 后向计算 (整个模型)

1.线性部分【LINEAR backward】

2.线性激活部分【LINEAR -> ACTIVATION backward】

为了帮助你实现linear_activation_backward,我们提供了两个后向函数:

  • sigmoid_backward:实现了sigmoid()函数的反向传播
  • relu_backward: 实现了relu()函数的反向传播 如果g(.) 是激活函数, 那么sigmoid_backward 和 relu_backward 这样计算:

image.png

对于多层模型L:

image.png 在之前的前向计算中,我们存储了一些包含包含(X,W,b和z)的cache,在反向传播中,我们将会使用它们来计算梯度值,所以,在L层模型中,我们需要从L层遍历所有的隐藏层,在每一步中,我们需要使用那一层的cache值来进行反向传播。

上面我们提到了A^{[L]} ,它属于输出层,A^{[L]} = σ(Z^{[L]}),所以我们需要计算dAL,计算完了以后,我们可以使用此激活后的梯度dAL继续向后计算。

5.更新参数

更新参数的公式如下:其中 α 是学习率。

image.png

四、整合方法代码模块

至此为止,我们已经实现该神经网络中所有需要的函数。接下来,我们将这些方法组合在一起,构成一个神经网络类,可以方便的使用。

1.搭建两层神经网络

一个两层的神经网络模型图如下: image.png 该模型可以概括为: INPUT -> LINEAR -> RELU -> LINEAR -> SIGMOID -> OUTPUT

2.搭建多层神经网络

一个多层的神经网络模型图如下:

image.png