现在,当我们初始化参数后,我们将执行前向传播模块。我们将从实现稍后将在实现模型时使用的一些基本功能开始。我们将按顺序完成三个功能:
- 线性;
- 线性->激活,其中激活将是RELU或Sigmoid;
- [线性->RELU]×(L-1)->线性->S型(整个模型)。
我可以在一个挡路中编写所有这些函数,但是为了便于学习,就更难理解代码了。我要提醒您的是,线性转发模块(在所有示例中矢量化)计算以下方程式:
其中A[0]=X
我们的LINEAR_FORWARD函数的代码:
参数:
a-来自上一层(或输入数据)的激活:(上一层的大小,示例数);W-权重矩阵:形状的NumPy数组(当前层的大小,上一层的大小);b-偏置向量,NumPy形状数组(当前层的大小,1)。
返回:
z-激活函数的输入,也称为预激活参数;cache-包含“A”、“W”和“b”的python字典;存储用于有效计算后向传递。
线性-激活正向功能:
在本教程中,我们将测试两个激活函数:Sigmoid和RELU:
乙状结肠:
我会给你写一个Sigmoid函数。此函数返回两个项目:激活值“a”和包含“Z”的“缓存”(这是我们将提供给相应的Backup函数的内容)。要使用它,我们将调用:
Sigmoid函数:
RELU:RELU的数学公式是A=RELU(Z)=max(0,Z)。我将为您编写relu函数。该函数返回两项:激活值“A”和包含“Z”的“缓存”(我们将把它提供给相应的Backup函数)。要使用它,我们将调用:
RELU功能:
为方便起见,我们将两个功能(线性和激活)分组为一个功能(线性->激活)。因此,我们将实现一个函数,该函数先执行线性前向步骤,然后执行激活前向步骤。
LINEAR_ACTIVATION_FORWARD函数的代码:
参数:
a_prev-来自上一层(或输入数据)的激活:(上一层的大小,示例数);W-权重矩阵:形状的NumPy数组(当前层的大小,上一层的大小);b-偏置向量,NumPy形状数组(当前层的大小,1);激活-要在该层中使用的激活,存储为文本字符串:“sigmoid”或“relu”。
返回:
a-激活函数的输出,也称为激活后的值;cache-一个Python字典,包含“linearcache”和“activate_cache”,有效地存储用于计算后向传递的“LINEAR_CACHE”和“ACTIVATION_CACHE”。
L层模型实施:
为了更方便地实现L层神经网络,我们将需要一个函数,该函数将上述(LINEAR_ACTIVATION_FORWARD WITH RELU)L−复制1次,然后用一个LINEAR_ACTIVATION_FORWARD Sigmoid复制。
因此,在编写代码时,我们将使用之前编写的函数。在下面的代码中,变量AL将表示:
我们的L_MODEL_FORWARD函数的代码:
参数:
x-data,Numpy形状数组(输入大小,示例数);Parameters-Initialize_Parameters_Deep()函数的输出。返回:
AL-最后一个激活后的值;高速缓存-包含LINEAR_ACTIVATION_FORWARD()的每个高速缓存的高速缓存列表(它们共有L-1个,索引从0到L-1)
现在我们可以用随机数测试我们在本教程中实现的函数,看看它们是否正常工作。我将用2个深层初始化神经网络,有4个输入和1个输出。对于输入,我将使用命令np.随机性.randn(输入大小,示例数量)。然后,我将调用L_MODEL_FORWARD函数:
我收到了这样的结果;您可能会收到一些不同的结果:
完整教程代码:
现在我们有了一个完整的前向传播,它接受输入X并输出包含我们的预测的行向量A[L]。它还将所有中间值记录在“缓存”中。使用A[L],我们可以计算预测的成本。
所以这是一个更难理解的教程部分,但别担心。您可以多读几遍,打印值以更好地理解。我们将在下一教程中构建成本函数,并开始构建反向传播函数。
最初发表于https://pylessons.com/Deep-neural-networks-part2https://pylessons.com/Deep-neural-networks-part2
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/27/%e6%b7%b1%e5%ba%a6%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e5%89%8d%e5%90%91%e4%bc%a0%e6%92%ad/