深度学习之参数初始化(一)——Xavier初始化

本文探讨了深度学习中参数初始化的重要性,重点介绍了Xavier初始化,旨在避免神经网络训练过程中的梯度消失问题。通过保持输入和输出的方差一致,Xavier初始化能确保信息在神经网络中有效流动。文章还提到了随机正态分布初始化的不足,并提及了适用于ReLU网络的Kaiming初始化和用于改善梯度分布的Batch Normalization。
摘要由CSDN通过智能技术生成

    我们需要牢记参数初始化的目的是为了让神经网络在训练过程中学习到有用的信息这意味着参数梯度不应该为0。而我们知道在全连接的神经网络中,参数梯度和反向传播得到的状态梯度以及入激活值有关——激活值饱和会导致该层状态梯度信息为0,然后导致下面所有层的参数梯度为0入激活值为0会导致对应参数梯度为0。所以如果要保证参数梯度不等于0,那么参数初始化应该使得各层激活值不会出现饱和现象且激活值不为0。我们把这两个条件总结为参数初始化条件:

  •     初始化必要条件一:各层激活值不会出现饱和现象。
  •     初始化必要条件二:各层激活值不为0。

下面讨论几种常见的初始化方式:

一、随机正态分布

      用10层神经网络,每一层的参数都是随机正态分布

1.1 设均值为0,标准差为0.01

tf.Variable(np.random.randn(node_in, node_out).astype('float32')) * 0.01
#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)
 
fcs = []
for i in range(0, num_layers - 1):
    X = data if i == 0 else fcs[i - 1]
    node_in = layer_sizes[i]
    node_out = layer_sizes[i + 1]
    W = tf.Variable(np.random.randn(node_in, node_out).astype('float32')) * 0.01
    fc = tf.matmul(X, W)
    # fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,
    #                                   is_training=True)
    fc = tf.nn.tanh(fc)
    fcs.append(fc)
 
#
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print('input mean {0:.5f} and std {
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值