本文作业是在jupyter notebook上一步一步做的,带有一些过程中查找的资料等(出处已标明)并翻译成了中文,如有错误,欢迎指正!
欢迎来到第四周作业(第二部分的第一部分)!您之前已经训练了一个两层的神经网络(只有一个隐藏层)。这周,你将构建一个深度神经网络,你想要多少层就有多少层!
•在本笔记本中,您将实现构建深度神经网络所需的所有功能(函数)。
•在下一个作业中,你将使用这些函数来建立一个用于图像分类的深度神经网络。
完成这项任务后,您将能够:
•使用非线性单元,比如ReLU来改进你的模型
•构建更深层次的神经网络(隐含层超过1层)
•实现一个易于使用的神经网络类
符号:
就是上标的【l】代表第l层,上标的【i】代表第i个样本,下标的 i 代表第 i 个条目
1 - Packages 包
让我们首先导入在此任务中需要的所有包。
·numpy是使用Python进行科学计算的主要包。
·matplotlib是一个用Python绘制图形的库。
·dnn_utils为本笔记本提供了一些必要的函数。
·testCases提供了一些测试用例来评估函数的正确性
·seed(1)用于保持所有随机函数调用的一致性。它将帮助我们批改你的作业。请不要换种子。
import numpy as np import h5py #h5py是Python语言用来操作HDF5的模块。 import matplotlib.pyplot as plt from testCases_v2 import * from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward %matplotlib inline plt.rcParams['figure.figsize'] = (5.0, 4.0) # set default size of plots plt.rcParams['image.interpolation'] = 'nearest' plt.rcParams['image.cmap'] = 'gray' %load_ext autoreload %autoreload 2 np.random.seed(1)
https://blog.csdn.net/csdn15698845876/article/details/73278120
软件的扩展和模块。autoreload 意思是自动重新装入。它后面可带参数。参数意思你要查你自己的版本帮助文件。一般说:
无参:装入所有模块。
0:不执行 装入命令。
1: 只装入所有 %aimport 要装模块
2:装入所有 %aimport 不包含的模块。
2 - Outline of the Assignment(作业大纲)
要构建神经网络,您将实现几个“辅助函数”。这些辅助函数将用于下一个任务,以建立一个两层神经网络和一个L层神经网络。您将实现的每个小助手函数都有详细的说明,这些说明将指导您完成必要的步骤。这是这个作业的大纲,你会:
•初始化一个二层网络和一个L层神经网络的参数。
•实现转发模块(下图中用紫色显示)。
◾完成一层的线性部分的向前传播步骤(得到Z [l])
◾我们给你激活函数(relu /sigmoid)
◾将前两步骤组合成一个新的函数【线性- >激活转发】
◾堆栈(线性- > RELU)提出时间 L - 1 函数(通过L - 1层1)并添加一个(线性- >sigmoid),最后(最后一层L)。这将为您提供一个新的L_model_forward函数。
•计算损失。
•实现反向传播模块(下图中用红色表示)。
◾完成一层的向后传播的线性部分的步骤。
◾我们给你激活函数的梯度(relu_backward / sigmoid_backward)
◾将前两步骤组合成一个新的线性- >激活 反向功能。
◾堆栈(线性- > RELU)向后 并添加l - 1倍(线性- >乙状结肠)向后一个新的L_model_backward函数
•最后更新参数。
**Figure 1**
注意,对于每个前向函数,都有一个对应的后向函数。这就是为什么在向前(前向)模块的每一步都要在缓存中存储一些值。缓存的值对于计算梯度很有用。在反向传播模块中,您将使用缓存计算梯度。这个作业将确切地告诉你如何执行这些步骤中的每一步。
3 - Initialization 初始化
您将编写两个帮助函数来初始化模型的参数。第一个函数将用于初始化一个两层模型的参数。第二种方法将这个初始化过程推广到L层。
3.1 - 2-layer Neural Network(2层神经网络)
练习:创建并初始化两层神经网络的参数。
说明:
•模型结构为:LINEAR -> RELU -> LINEAR -> SIGMOID。
•对权重矩阵使用随机初始化。使用np.random.randn(shape)*0.01表示正确的形状。
•对偏差使用零初始化。使用np.zeros(形状)。
1 # GRADED FUNCTION: initialize_parameters 2 3 def initialize_parameters(n_x, n_h, n_y): 4 """ 5 Argument: 6 n_x -- size of the input layer 7 n_h -- size of the hidden layer 8 n_y -- size of the output layer 9 10 Returns: 11 parameters -- python dictionary containing your parameters: 12 W1 -- weight matrix of shape (n_h, n_x) 13 b1 -- bias vector of shape (n_h, 1) 14 W2 -- weight matrix of shape (n_y, n_h) 15 b2 -- bias vector of shape (n_y, 1) 16 """ 17 18 np.random.seed(1) 19 20 ### START CODE HERE ### (≈ 4 lines of code) 21 W1 = np.random.randn(n_h, n_x)*0.01 22 b1 = np.zeros((n_h, 1)) 23 W2 = np.random.randn(n_y, n_h)*0.01 24 b2 = np.zeros((n_y, 1)) 25 ### END CODE HERE ### 26 27 assert(W1.shape == (n_h, n_x)) 28 assert(b1.shape == (n_h, 1)) 29 assert(W2.shape == (n_y, n_h)) 30 assert(b2.shape == (n_y, 1)) 31 32 parameters = {"W1": W1, 33 "b1": b1, 34 "W2": W2, 35 "b2": b2} 36 37 return parameters