1. 磐创AI-开放猫官方网站首页
  2. Medium

深度神经网络的逐步初始化

欢迎学习另一个教程。在上一个系列教程中,我们编写了两层神经网络模型。现在是建立一个深层神经网络的时候了,在那里我们可以拥有任何我们想要的层数。In the last tutorial series

因此,与前面的教程一样,我们将首先实现构建深度神经网络所需的所有功能。然后,我们将使用这些函数来构建用于图像分类的深度神经网络(猫与狗)。

在本系列教程中,我将使用像RELU这样的非线性单元来改进我们的模型。我们的深度神经网络模型将被构建为容易定义我们的模型将易于使用的深层。

这是我的一个隐藏层神经网络教程的续篇教程,使用相同的数据集。如果你第一次看这个教程,猫和狗的数据集,你可以从我的GitHub页面上获得。如果您不知道如何使用数据集,请查看我以前的教程。GitHub

首先,让我们定义我们的模型结构:

和前面的教程一样,构建一个深度神经网络,并实现几个“助手功能”。这些辅助函数将用于构建两层神经网络和L层神经网络。在每一个小帮手函数中,我们都会去实现,我会尽量给大家详细的讲解。因此,我们在本系列教程中要做的是:

  • 初始化二层网络和L层神经网络的参数;
  • 实现正向传播模块(如下图所示);-完成层的正向传播步骤的线性部分(产生Z[l]);-我们将编写激活函数(relu/sigmoid);-我们将把前两个步骤组合成一个新的[线性->激活]正向函数;-将[线性->relu]正向函数堆叠L-1次(对于层1到L-1),并在末尾(对于最后一层L)添加一个[线性->Sigmoid]。这将给出一个新的L_MODEL_FORWARD函数;
  • 计算损失;
  • 实现反向传播模块(下图用红色表示);-完成一层反向传播步骤的线性部分;-我们将写入激活函数的梯度(relu_back/sigmoid_backward);-将前两步合并为新的[线性->激活]反向函数;-向后L-1次堆叠[线性->relu],并在新的L_model_backward函数中向后添加[线性->sigmoid];
  • 最后,更新参数。


您将看到,对于每个正向函数,都会有一个相应的向后函数。这就是为什么我们在转发模块的每一步都要在缓存中存储一些值的原因。缓存的值将对计算渐变很有用。在反向传播模块中,我们将使用缓存来计算渐变。在本系列教程中,我将确切地向您展示如何执行这些步骤。

参数初始化:

我将编写两个助手函数,它们将为我们的模型初始化参数。第一个函数将用于初始化两层模型的参数。第二个将把这个初始化过程推广到L个层。

因此,为了不重复编写代码,我将复制上一教程中的两层模型的初始化函数:tutorial

深层L层神经网络的参数初始化比较复杂,因为权值矩阵和偏差向量较多。当我们完成Initialize_Parameters_Deep函数时,我们应该确保我们的维度与每一层相匹配。

回想一下,n[l]是层l中的单元数。因此,例如,如果我们的输入X的大小是(12288,6002)(例如m=6002),那么:

我应该提醒您,当我们在python中计算wx+b时,它执行广播。例如,如果:

则wx+b将为:

因此,我们将执行以下操作来实现L层神经网络的初始化功能:

  • 模型的结构将是:*[线性->RELU]×(L-1)->线性->S形*。在我们的示例中,它将具有使用RELU激活函数的L个−1层,其后是具有S形激活函数的输出层;
  • 我们将对权重矩阵使用随机初始化:np.随机.randn(形状)∗0.01;
  • 我们将对偏置使用零初始化。使用np.zeros(形状);
  • 我们将不同层中的单元数量n[l]存储在变量‘layer_dims’中。例如,如果我们声明‘layer_dims’为[2,4,1]:将有两个输入,一个隐藏层有4个隐藏单元,一个输出层有1个输出单元。这意味着w1的形状是(4,2),b1是(4,1),W2是(1,4),b2是(1,1)。现在我们将其推广到L层。

在进一步讨论之前,我们需要概述整个符号:

  • 上标[l]表示与第l层相关联的量。例如,[L]是第l层激活。w[L]和b[L]为第l层参数;
  • 上标(I)表示与第i个示例相关联的量。示例:X(I)是第i个训练示例;
  • 小脚本i表示向量的第i个条目。示例:A[i]表示第i层激活的第i个条目。

我们深层参数初始化的代码:

参数:

Layer_Dimension-包含网络中每个图层的维度的python数组(列表

返回:

  • 参数-包含参数“w1”、“b1”、…的Python字典,“wl”,“bl”:wl-形状权重矩阵(layer_Dimensions[l],layer_Dimensions[l-1]);bl-形状偏向向量(Layer_Dimensions[l],1)。

所以我们写了我们的函数。让我们用随机数来测试一下:

我们将收到:

由于随机初始化,您可能会收到不同的值。让我们测试更深层次的初始化:

那么我们会收到一些关于这个的东西:

完整教程代码:

结论:

因此,在我们的第一个深度学习教程中,我们定义了模型结构和需要执行的步骤。因此,我们完成了第一步,即初始化深层网络参数。我们尝试用一个隐藏层和两个隐藏层来初始化神经网络;一切都运行得很好。在下一个教程中,我们将开始构建前向传播函数。

最初发表于https://pylessons.com/Deep-neural-networks-part1https://pylessons.com/Deep-neural-networks-part1

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/25/%e6%b7%b1%e5%ba%a6%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e7%9a%84%e9%80%90%e6%ad%a5%e5%88%9d%e5%a7%8b%e5%8c%96/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息