初始化重量和偏差的问题?

时间:2016-08-17 08:10:35

标签: tensorflow

我使用CNN进行32x32bit图像的分类(6类)。

网络表现得非常奇怪,因为它需要900步才能完成与粘贴这些结果不同的任何操作。之后,经过几千步后,它开始移动到达合理的值。在Theano / Keras中使用相同数据完成的“相同网络”显示结果更快。我说“同一个网络”,因为Theano / Keras让我在变量(init =“orthogonal”)上定义leakyRELU和其他一些初始化方法,让我相信我的问题在于初始化。但我可能很远; - )

    step        ->  900
    Minibatch loss at step 900: 1.440395
    Minibatch accuracy: 43.0%
    Validation accuracy: 35.5%
    Val F-score: 0.0872979214781    
    confusion matrix 
 [[  0   0   0   0   0   0]
 [  0   0   0   0   0   0]
 [  0   0   0   0   0   0]
 [  0   0   0   0   0   0] 
 [ 21 292 224 398 567  96]
 [  0   0   0   0   0   0]]

我的优化器是

tf.train.GradientDescentOptimizer(0.1).minimize(loss)

我的权重和偏差初始化是(仅显示6的第1层,但相同)

wc1 = tf.Variable(tf.truncated_normal([2, 2, 1, 16], stddev=0.05), name="weights_1")
bc1 = tf.Variable(tf.zeros([16]), name="bias_1")

任何人都可以暗示:

  1. 为什么需要900步才能让网络“做点什么”
  2. 为什么混淆矩阵在开始时给我这个统一的预测
  3. 非常感谢 彼得

2 个答案:

答案 0 :(得分:1)

只要你使用标准的Relu单位,将偏差初始化为0是一个坏主意,因为这些神经元很容易死亡。这意味着Relu进入一种状态,它为每个输入输出0,同时也具有0梯度。因此,它不再受过训练,并且通过始终输出0来影响下游神经元。我要尝试的第一件事是初始化更高的偏差。另一个选择是使用泄漏的relu模拟,例如elu,它在tensorflow中可用。

另外,混淆矩阵中的列和行是什么意思?基于该输出,它意味着每个示例都具有相同的标签(在这种情况下,您应该检查您的标签)或每个示例是由网络获得相同的预测(在这种情况下,您应该担心死亡的神经元) 。

您也可以尝试降低学习率;它可能太高,导致不稳定。最后,如果问题与初始化有关,则可以在900步之后获取输出并将其用作初始化。我只会在确定神经元死亡得到照顾后才会尝试。

答案 1 :(得分:0)

如果使用relu激活功能,请查看“ kaiming初始化”以了解您的体重。目的是在前进过程中的每一层之后,将输出的平均值保持为0,将标准偏差保持为1。

对于relu激活功能,您必须使用随机正态分布乘以2 /(给定层的输入数量)的平方根来初始化。

fork

对于CNN,我认为输入数将是过滤器数*内核中的单元数(对于[5,5]内核,则为5 * 5)