在我的问题中,我刚开始使用的初始化函数是 tf.truncated_normal,与random_normal 函数不同,truncated_normal的范围限制在两个标准差之间,会把不符合条件的随机数丢弃。
当我将初始化函数换做tf.random_normal之后效果并没有好转,分析了原因,是因为我设置的每一层的权重初始化值都是tf.random_normal(shape, 0.0, 0.1),在梯度图中查看的时候,会发现有些层的最大值已经爆炸了,所以要根据每一层的最大值来设置每一层的初始化。下面是tensorboard中的梯度图:
要注意分析每一层中的最大值。例如刚开始层的初始值的方差是0.1,这一层的梯度最大值是几十万或者几万,肯定是梯度爆炸的,你需要将方差调小一些。另外调整了这一层之后有可能会对后面的层有影响,需要自行观察之后再重新调节。
当tensorboard中的histogram数值基本正常之后,也就是初始化层正常,但是还没有开始学习,那就是需要调节学习率,调好学习率之后,再自行调节其他的超参数,例如图像占比等。
下面是我在网上找到的一些理论性解释,有助于帮助理解网络初始化的重要性。
如下的理论性解释参考的是https://www.cnblogs.com/chason95/articles/10711017.html
训练神经网络的时候需先给定一个初试值,然后才能通过反向传播等方法进行参数更新。所以参数的初始化起着至关重要的作用
1.全0初始化:不能这么做
做会导致所有参数都无法被更新。
2.全相同常数初始化:不能这么做
下图的转载地址为:https://www.cnblogs.com/makefile/p/init-weight.html?utm_source=itdadao&utm_medium=referral