本文是吴恩达《深度学习》L2W1的编程作业2。
本文是跟着参考资料的步骤过了一遍作业,做到加深理解的目的,其中所有需要下载的资料都在第二条参考资料里面。
我的实验环境是天池的NoteBook
总任务
- 初始化参数,详见上篇《深度学习 | 初始化参数 实践练习》
1.1 使用0来初始化参数
1.2 使用随机数来初始化参数
1.3 使用抑梯度异常(如梯度消失和梯度爆炸)初始化参数 - 正则化模型
2.1 使用二范数对二分类模型正则化,尝试避免过拟合
2.2 使用随机删除节点方法精简模型,尝试避免过拟合 - 梯度校验
3.1 对模型使用梯度校验,检测它是否在梯度下降的过程中出现了误差过大的情况。
2 正则化模型
- 正则化是用来解决模型过拟合的问题的,“过拟合”的意思是模型的学习能力过强了把一些特性的东西也学成了普适性的东西,比如辨别苹果和香蕉,模型把红色的物体都识别成了苹果。
0 任务描述
- 你刚刚被法国足球公司聘为AI专家。他们希望你推荐预测法国守门员将球踢出的位置,以便法国队的球员可以用头将球击中。
- 导入数据集并查看:
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 = reg_utils.load_2D_dataset(is_plot=True)
- 如图所示,蓝色是本队球员可能抢到球,红色表示对方队员能抢到球,我们需要做的就是找到适合我方队员能抢球的位置。
2.1 非正则化模型
- 模型如下,其中“lambd”是为了不与python中的“lambda”关键字冲突
- 随机删除节点-将keep_prob设置为小于1的值;“keep_prob”指的是保留下来的程度。
def model(X,Y,learning_rate=0.3,num_iterations=30000,print_cost=True,is_plot=True,lambd=0,keep_prob=1):
"""
实现一个三层的神经网络:LINEAR ->RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
参数:
X - 输入的数据,维度为(2, 要训练/测试的数量)
Y - 标签,【0(蓝色) | 1(红色)】,维度为(1,对应的是输入的数据的标签)
learning_rate - 学习速率
num_iterations - 迭代的次数
print_cost - 是否打印成本值,每迭代10000次打印一次,但是每1000次记录一个成本值
is_polt - 是否绘制梯度下降的曲线图
lambd - 正则化的超参数,实数
keep_prob - 随机删除节点的概率
返回
parameters - 学习后的参数
"""
grads = {
}
costs = []
m = X.shape[1]
layers_dims = [X.shape[0],20,3,1]
#初始化参数
parameters = reg_utils.initialize_parameters(layers_dims)
#开始学习
for i in range(0,num_iterations):
#前向传播
##是否随机删除节点
if keep_prob == 1:
###不随机删除节点
a3 , cache = reg_utils.forward_propagation(X,parameters)
elif keep_prob < 1:
###随机删除节点
a3 , cache = forward_propagation_with_dropout(X,parameters,keep_prob)
else:
print("keep_prob参数错误!程序退出。")
exit
#计算成本
## 是否使用二范数
if lambd == 0:
###不使用L2正则化
cost = reg_utils.compute_cost(a3,Y)
else:
###使用L2正则化
cost = compute_cost_with_regularization(a3,Y,parameters,lambd)
#反向传播
##可以同时使用L2正则化和随机删除节点,但是本次实验不同时使用。
assert(lambd == 0 or keep_prob ==1)
##两个参数的使用情况
if (lambd == 0 and keep_prob == 1):
### 不使用L2正则化和不使用随机删除节点
grads = reg_utils.backward_propagation(X,Y,cache)
elif lambd != 0:
### 使用L2正则化,不使用随机删除节点
grads = backward_propagation_with_regularization(X, Y, cache, lambd)
elif keep_prob < 1:
### 使用随机删除节点,不使用L2正则化
grads = backward_propagation_with_dropout(X, Y, cache, keep_prob)
#更新参数
parameters = reg_utils.update_parameters(parameters, grads, learning_rate)
#记录并打印成本
if i % 1000 == 0:
## 记录成本
costs.append(cost)
if (print_cost and i % 10000 == 0):
#打印成本
print("第" + str(i) + "次迭代,成本值为:" + str(cost))
#是否绘制成本曲线图
if is_plot:
plt.plot(costs)
plt.ylabel('cost')
plt.xlabel('iterations (x1,000)')
plt.title("Learning rate =" + str(learning_rate))
plt.show()
#返回学习后的参数
return parameters
#不使用正则化测试
parameters = model(train_X, train_Y,is_plot=True)
print("训练集:")
predictions_train = reg_utils