本文是吴恩达《深度学习》L2W1的编程作业1。
本文是跟着参考资料的步骤过了一遍作业,做到加深理解的目的,其中所有需要下载的资料都在第二条参考资料里面。
我的实验环境是天池的NoteBook
总任务
- 初始化参数
1.1 使用0来初始化参数
1.2 使用随机数来初始化参数
1.3 使用抑梯度异常(如梯度消失和梯度爆炸)初始化参数 - 正则化模型
2.1 使用二范数对二分类模型正则化,尝试避免过拟合
2.2 使用随机删除节点方法精简模型,尝试避免过拟合 - 梯度校验
3.1 对模型使用梯度校验,检测它是否在梯度下降的过程中出现了误差过大的情况。
1 初始化参数
- 好的初始化可以:
- 加快梯度下降、模型收敛
- 减小梯度下降收敛过程中训练(和泛化)出现误差的几率
- 先导入库,并来查看初始的数据集分布:
import numpy as np
import matplotlib.pyplot as plt
import sklearn
import sklearn.datasets
import init_utils #初始化
import reg_utils #正则化
import gc_utils#梯度校验
%matplotlib inline
plt.rcParams['figure.figsize']=(7.0,4.0) #设置图表默认大小
plt.rcParams['image.interpolation']='nearest'
plt.rcParams['image.cmap']='gray'
train_X, train_Y, test_X, test_Y = init_utils.load_dataset(is_plot=True)
- 我们需要做的就是将两种点分开,我们先要进行初始化,右以下三种初始化方法:
- 零初始化 :在输入参数中设置
initialization = "zeros"
。- 核心代码:
parameters['W'+str(l)=np.zeros((layers_dims[l],layers_dims[l-1]))
- 核心代码:
- 随机初始化 :在输入参数中设置
initialization = "random"
,这会将权重初始化为较大的随机值。- 核心代码:
parameters['W'+str(l)]=np.random.random.randn(layers_dims[l],layers_dims[l-1])*10
- 核心代码:
- He初始化 :在输入参数中设置
initialization = "he"
,这会根据He等人(2015)的论文将权重初始化为按比例缩放的随机值。- 核心代码:
parameters['W'+str(l)=np.random.randn(layers_dims[l],layers_dims[l-1])*np.sqrt(2/layers_dims[l-1])
- 核心代码:
- 零初始化 :在输入参数中设置
- 老师已经提供的模型如下:
def model(X,Y,learning_rate=0.01,num_iterations=15000,print_cost=True,initialization="he",is_polt=True):
"""
实现一个三层的神经网络:LINEAR ->RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
参数:
X - 输入的数据,维度为(2, 要训练/测试的数量)
Y - 标签,【0 | 1】,维度为(1,对应的是输入的数据的标签)
learning_rate - 学习速率
num_iterations - 迭代的次数
print_cost - 是否打印成本值,每迭代1000次打印一次
initialization - 字符串类型,初始化的类型【"zeros" | "random" | "he"】
is_polt - 是否绘制梯度下降的曲线图
返回
parameters - 学习后的参数
"""
grads = {
}
costs = []
m = X.shape[1]
layers_dims = [X.shape[0],10,5,1]
#选择初始化参数的类型
if initialization == "zeros":
parameters = initialize_parameters_zeros(layers_dims)
elif initialization == "random":
parameters = initialize_parameters_random(layers_dims)
elif initialization == "he":
parameters = initialize_parameters_he(layers_dims)
else :
print("错误的初始化参数!程序退出")
exit
#开始学习
for i in range(0,num_iterations):
#前向传播
a3 , cache = init_utils.forward_propagation(X,parameters)
#计算成本
cost = init_utils.compute_loss(a3,Y)
#反向传播
grads = init_utils.backward_propagation(X,Y,cache)
#更新参数
parameters = init_utils.update_parameters(parameters,grads,learning_rate)
#记录成本
if i % 1000 ==