深度学习 | 正则化 实践练习

本文是深度学习课程的实践练习,探讨了正则化在避免过拟合中的作用。首先介绍了非正则化模型导致的过拟合问题,然后详细解释了L2正则化和Dropout技术,包括它们的原理、实现方式及其对模型性能的影响。通过调整超参数λ,展示了L2正则化如何使决策边界更平滑,并讨论了Dropout在训练期间随机关闭神经元以提升模型泛化能力的机制。最后强调了正则化只应用于训练阶段的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是吴恩达《深度学习》L2W1的编程作业2。

本文是跟着参考资料的步骤过了一遍作业,做到加深理解的目的,其中所有需要下载的资料都在第二条参考资料里面。

我的实验环境是天池的NoteBook


总任务

  1. 初始化参数,详见上篇《深度学习 | 初始化参数 实践练习》
    1.1 使用0来初始化参数
    1.2 使用随机数来初始化参数
    1.3 使用抑梯度异常(如梯度消失和梯度爆炸)初始化参数
  2. 正则化模型
    2.1 使用二范数对二分类模型正则化,尝试避免过拟合
    2.2 使用随机删除节点方法精简模型,尝试避免过拟合
  3. 梯度校验
    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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值