007_wz_wed_DL_课程一第四周编程题

搭建多层神经网络

一、目的

我们要使用非线性激活函数搭建一个两层神经网络和具有多个隐藏层的神经网络

二、训练集与测试集

百度网盘,提取码:1234

三、编程

这是本次编程需要用的的所有模块和工具类

import numpy as np
import matplotlib.pyplot as plt
import h5py
from dnn_utils import *
import lr_utils
import testCases

并且我们为了得到相同的结果,我们指定一个随机种子np.random.seed(1)

3.1 网络结构和方法

在本次编程中,我们要构建两个神经网络,一个是构建两层的神经网络,一个是构建多层的神经网络,本文会提到 [LINEAR-> ACTIVATION]转发函数,比如我有一个多层的神经网络,结构是输入层->隐藏层->隐藏层->···->隐藏层->输出层,在每一层中,我会首先计算Z = np.dot(W,A) + b,这叫做【linear_forward】,然后再计算A = relu(Z) 或者 A = sigmoid(Z),这叫做【linear_activation_forward】,合并起来就是这一层的计算方法,所以每一层的计算都有两个步骤,先是计算Z,再计算A,可以参照下图:
007_wz_wed_DL_课程一第四周编程题
构建一个多层的神经网络的步骤如下:

  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来计算梯度, 现在我们正式开始分别构建两层神经网络和多层神经网络。

3.2 初始化网络参数

3.2.1 两层神经网络参数初始化

对于一个两层的神经网络结构而言,模型结构是线性->ReLU->线性->sigmod函数。

# 两层神经网络参数初始化
def initialize_parameters(n_x, n_h, n_y):
    """
    两层神经网络参数初始化
    :param n_x: 输入层节点数量
    :param n_h: 隐藏层节点数量
    :param n_y: 输出层节点数量
    :return: parameters:一个包含W和b初始值的字典值
    """
    W1 = np.random.randn(n_h, n_x) * 0.01
    b1 = np.zeros((n_h, 1))
    W2 = np.random.randn(n_y, n_h) * 0.01
    b2 = np.zeros((n_y, 1))

    assert (W1.shape == (n_h, n_x))
    assert (b1.shape == (n_h, 1))
    assert (W2.shape == (n_y, n_h))
    assert (b2.shape == (n_y, 1))

    parameters = {
        "W1": W1,
        "b1": b1,
        "W2": W2,
        "b2": b2
    }

    return parameters
上一篇:【AI视野·今日CV 计算机视觉论文速览 第197期】Wed, 12 May 2021


下一篇:Azure 对象存储提示令牌过期