深度学习 | 初始化参数 实践练习

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

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

我的实验环境是天池的NoteBook


总任务

  1. 初始化参数
    1.1 使用0来初始化参数
    1.2 使用随机数来初始化参数
    1.3 使用抑梯度异常(如梯度消失和梯度爆炸)初始化参数
  2. 正则化模型
    2.1 使用二范数对二分类模型正则化,尝试避免过拟合
    2.2 使用随机删除节点方法精简模型,尝试避免过拟合
  3. 梯度校验
    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 == 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值