BasicRNNCell偏差不受训练

时间:2018-03-09 15:27:18

标签: python tensorflow machine-learning deep-learning recurrent-neural-network

我的网络在训练时遇到了大约70%的准确率,验证准确率只有50%以上(这是一个两级分类问题)。我正在调试它,并希望排除以下原因。

该网络包括BasicRNNCell

rnn_cell = tensorflow.contrib.rnn.BasicRNNCell(100)

tensorflow为此RNN层创建权重和偏差,我可以使用tf.trainable_variables()找到它:

<tf.Variable 'network/rnn/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref>,
<tf.Variable 'network/rnn/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref>

在训练过程中,kernel:0的值会按照我的预期改变每一步,另一侧的bias的值都为零并且不会改变。我正在使用AdagradOptimizer:

optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate).minimize(cost)

根据我的理解,每个训练步骤都应该更新偏差,比如重量。

这是预期的行为吗?这可能是让我的学习陷入困境的原因吗?

1 个答案:

答案 0 :(得分:1)

根据我的经验,我不会专注于这样的细节。很难说你所给出的是否应该存在非零偏差。使用RNN时,最好使用剪切渐变。我看到使用这个

的培训有了很大的改进
    optimizer = tf.train.AdamOptimizer(learning_rate)

    # Calculate and clip gradients
    params = tf.trainable_variables()
    gradients = tf.gradients(rnn.loss, params)
    clipped_gradients, _ = tf.clip_by_global_norm(
        gradients, FLAGS.max_gradient_norm)
    train_op = optimizer.apply_gradients(zip(clipped_gradients,params), global_step=global_step)

通常,1到5之间的max_gradient_norm效果最佳。我也更喜欢adamOptimizer。我希望这有帮助!