如何在keras的可变Dropout LSTM层上使用MC Dropout?

时间:2019-01-22 17:31:35

标签: keras lstm keras-layer dropout

我目前正在尝试使用Keras(tensorflow后端)建立一个(LSTM)循环神经网络。 我想使用带有MC Dropout的变体辍学。 我相信LSTM层的选项“ recurrent_dropout”已经实现了变体辍学,但我找不到任何方法像传统的Dropout层一样设置“ training”标志来置为真。

2 个答案:

答案 0 :(得分:1)

这在Keras中非常容易,首先您需要定义一个同时接受模型输入和learning_phase的函数:

import keras.backend as K
f = K.function([model.layers[0].input, K.learning_phase()],
               [model.layers[-1].output])

对于具有多个输入/输出的功能API模型,可以使用:

f = K.function([model.inputs, K.learning_phase()],
               [model.outputs])

然后,您可以像调用f([input, 1])一样调用此函数,这将告诉Keras在此调用期间启用学习阶段,并执行Dropout。然后,您可以多次调用此函数,并将预测结合起来以估计不确定性。

答案 1 :(得分:0)

“作为贝叶斯近似降落:表示深度学习中的模型不确定性”(2015年)的源代码位于https://github.com/yaringal/DropoutUncertaintyExps/blob/master/net/net.py。他们还使用Keras,代码很容易理解。 Dropout层不使用 Sequential api来传递训练参数。这是Matias提出建议的另一种方法:

inter = Dropout(dropout_rate)(inter, training=True)