深度网络中的的权重初始化与正则化(初始化与激活函数搭配问题)

一,kernel_initializer&bias_initializer:
建网络层时内核或者偏差权重的初始化方案。此参数是名称或可调用对象。

二,kernel_regularizer&bias_regularizer:
设置应用于网络层中内核或者偏差权重的正则化方案,例如L1或L2正则化。默认情况下,不应用正则化。

三,初始化及正则化的作用
在设计深度学习模型的时候,我们经常需要使用正则化(Regularization)技巧来减少模型的过拟合效果,例如 L1 正则化、L2 正则化等。合理的初始化可以加速收敛。

四,正则化
在Keras中,我们可以使用三种正则化技巧:
keras.regularizers.l1
keras.regularizers.l2
keras.regularizers.l1_l2

例子L2正则化

w_l2 = 1e-4
out_pam = Conv2D(nc, kernel_size=3, kernel_regularizer=regularizers.l2(w_l2),  
                      kernel_initializer=conv_init, use_bias=False, padding="same")(out_pam)

五,初始化
初始化方法很多,常见的有RandomNormal,RandomUniform,TruncatedNormal,VarianceScaling,Identiy,lecun_uniform,lecun_normal,glorot_normal,glorot_uniform,he_normal,he_uniform,也可以自定义的。
我看到网络中使用最多的还是he_normal,一般与relu激活函数搭配

例子’he_normal’

conv_init = 'he_normal'
w_l2 = 1e-4
kernel_regularizer=regularizers.l2(w_l2),  
                      kernel_initializer=conv_init, use_bias=False, padding="same")(out_pam)
from keras import initializers
keras.initializers.Zeros()
keras.initializers.Ones()#全1
keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None))#指定均值和方差的正态分布初始化
keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)#指定下边界和上边界的均匀分布初始化
keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)#截尾高斯分布初始化,位于均值两个标准差以外的数据将会被丢弃并重新生成,形成截尾分布

自定义初始化

def my_init(shape, dtype=None):
    return K.random_normal(shape, dtype=dtype)
model.add(Dense(64, init=my_init))

六,激活函数与初始化搭配问题
relu搭配he_normal
经过He initialization后,当隐藏层使用ReLU时,激活函数的输出值的分布情况:
深度网络中的的权重初始化与正则化(初始化与激活函数搭配问题)_第1张图片

tanH搭配Xavier initialization
Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想倒也简单,就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。
Xavier initialization后每层的激活函数输出值的分布:
深度网络中的的权重初始化与正则化(初始化与激活函数搭配问题)_第2张图片
虽然Xavier initialization能够很好的 tanH 激活函数,但是对于目前神经网络中最常用的ReLU激活函数,还是无能能力,当达到5,6层后几乎又开始趋向于0,更深层的话很明显又会趋向于0。
深度网络中的的权重初始化与正则化(初始化与激活函数搭配问题)_第3张图片

你可能感兴趣的:(keras,AI,tensorflow)