我建立了一个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
导致不同的输出?
如果是这样,我该如何解决这个问题?
由于
答案 0 :(得分:1)
尝试使用seed
的{{1}}关键字参数:
DropoutWrapper(...)
请参阅lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.5, seed=42)
答案 1 :(得分:1)
Dropout将随机激活您网络的一个子集,并在训练期间用于正规化。因为您已经将输出硬编码为0.5,这意味着每次运行网络时,您的节点将被随机静音,从而产生不同的随机结果。
你可以通过设置种子来检查这是发生了什么,这样每次都可以通过丢失“随机”沉默相同的节点。但是,您可能想要做的是将dropout作为占位符,以便在测试时间内将其设置为1.0(即保留所有节点),这将确定性地为每个输入生成相同的输出。