吴恩达深度学习第二课第一周作业及学习心得体会——初始化权重、L2正则化、dropout

概述

学习课程后,再第一周第四课作业的基础上完成该周作业,现将心得体会记录如下。

初始化权重

代码更改

在之前的建立神经网络的过程中,提到权重w不能为0,而将它初始化为一个随机的值。然而在一个深层神经网络中,当w的值被初始化过大时,进入深层时呈指数型增长,造成梯度爆炸;过小时又会呈指数级衰减,造成梯度消失

Python中将w进行随机初始化时,使用numpy库中的np.random.randn()方法,randn是从均值为0的单位标准正态分布(也称“高斯分布”)进行取样。随着对神经网络中的某一层输入的数据量n的增长,输出数据的分布中,方差也在增大。结果证明,可以除以输入数据量n的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了,不会过大导致到指数级爆炸或过小而指数级衰减。

代码更改如下:

  • 参数初始化函数:
def init_para(layer_dims, init_mode):
    L = len(layer_dims)             #L为总层数
    np.random.seed(L)
    parameters = {}
    if init_mode=='zero':
        for l in range(1,L):            #初始化W1~WL,b1~bL
            parameters['W'+str(l)] = np.zeros((layer_dims[l], layer_dims[l-1]))
            parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))
    if init_mode=='random':
        for l in range(1,L):            #初始化W1~WL,b1~bL
            parameters['W'+str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1])*0.01
            parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))
    if init_mode=='norm':
        for l in range(1,L):            #初始化W1~WL,b1~bL
            parameters['W'+str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1])*np.sqrt(1.0/(layer_dims[l-1]))
            parameters['b'+str(l)] = np.zeros((layer_dims[l], 1))    
    return parameters
  • 模型函数:
def NN_model(X, Y, layer_dims, learning_steps, learning_rate, print_flag, init_mode):
    np.random.seed(1)
    costs=[]
    parameters =  init_para(layer_dims, init_mode)      #初始化参数
    for i in range(0, learning_steps):                  #进行learning_steps次训练
        AL, caches = prop_forward(X, parameters)        #前向传播,计算A1~AL
        cost = compute_cost(AL,Y)                       #计算成本
        grads = prop_backward(AL, Y, caches)            #反向传播,计算dW1~dWL,db1~dbL
        parameters = update_para(parameters, grads, learning_rate)  #更新参数
        if print_flag==True and i%1000==0:
            print('cost at %i steps:%f'%(i, cost))
            costs.append(cost)
    return parameters,costs

 

实施效果

二元分类问题1

样本数据集代码如下:

def gendata():
    np.random.seed(1)
    m = 600                                 #样本数
    N = int(m/2)                            #分为两类
    D = 2                                   #样本的特征数或维度
    X = np.zeros((m,D))                     #初始化样本坐标
    Y = np.zeros((m,1))                     #初始化样本标签
    a = 4                                   #基础半径
    for j in range(2):
        ix = range(N*j,N*(j+1))#ix=(0,199)(200,399)
        t = np.linspace(j*3.14,(j+1)*3.14,N)                            #theta角度,产生200个角度并加入随机数,保证角度随机分开,图像开起来稀疏程度不一
        r = a*np.sin(4*t) + np.random.randn(N)*0.4                      #radius半径,4sin(4*t),并加入一定的随机,图像轨道不平滑
        X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]                         #生成坐标点
        Y[ix] = j                                                       #red or blue
    return X.T,Y.T

令layer_dims=[2,4,3,2,1],learning_steps=20000,learning_rate=0.5。

当init_mode='zero'时:

当init_mode='random'时:

当init_mode='norm'时:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值