Tensorflow:DropoutWrapper导致不同的输出?

时间:2016-12-16 06:49:01

标签: python tensorflow lstm

我建立了一个LSTM,如:

lstm_cell = tf.nn.rnn_cell.LSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True, activation=tf.nn.tanh)
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.5)
lstm_cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * 3, state_is_tuple=True)

然后我训练模型,并保存变量。 下次我加载保存的变量并跳过训练时,它会给我一个不同的预测。

如果我将output_keep_prob更改为1,此模型始终可以显示相同的预测,但如果output_keep_prob小于1,如0.5,则此模型每次都会显示不同的预测。

所以我想如果DropoutWrapper导致不同的输出? 如果是这样,我该如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:1)

尝试使用seed的{​​{1}}关键字参数:

DropoutWrapper(...)

请参阅lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.5, seed=42)

的文档here

答案 1 :(得分:1)

Dropout将随机激活您网络的一个子集,并在训练期间用于正规化。因为您已经将输出硬编码为0.5,这意味着每次运行网络时,您的节点将被随机静音,从而产生不同的随机结果。

你可以通过设置种子来检查这是发生了什么,这样每次都可以通过丢失“随机”沉默相同的节点。但是,您可能想要做的是将dropout作为占位符,以便在测试时间内将其设置为1.0(即保留所有节点),这将确定性地为每个输入生成相同的输出。