如何在 keras 上的变分 dropout LSTM 层上使用 MC Dropout?
How to use MC Dropout on a variational dropout LSTM layer on keras?
我目前正在尝试使用 Keras(tensorflow 后端)设置一个 (LSTM) 递归神经网络。
我想在其上使用带有 MC Dropout 的 variational dropout。
我相信变分 dropout 已经通过 LSTM 层的选项 "recurrent_dropout" 实现,但我找不到任何方法来设置 "training" 标志以像经典的 Dropout 层一样设置为 true。
这在 Keras 中很容易,首先你需要定义一个函数,它接受模型输入和 learning_phase
:
import keras.backend as K
f = K.function([model.layers[0].input, K.learning_phase()],
[model.layers[-1].output])
对于具有多个 inputs/outputs 的函数 API 模型,您可以使用:
f = K.function([model.inputs, K.learning_phase()],
[model.outputs])
然后你可以像f([input, 1])
一样调用这个函数,这将告诉Keras在这个调用期间启用学习阶段,执行Dropout。然后你可以多次调用这个函数并结合预测来估计不确定性。
"Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning" (2015) 的源代码位于 https://github.com/yaringal/DropoutUncertaintyExps/blob/master/net/net.py。他们还使用 Keras,代码非常容易理解。为了传递训练参数,在没有 Sequential api 的情况下使用 Dropout 层。这是 Matias 建议的不同方法:
inter = Dropout(dropout_rate)(inter, training=True)
我目前正在尝试使用 Keras(tensorflow 后端)设置一个 (LSTM) 递归神经网络。 我想在其上使用带有 MC Dropout 的 variational dropout。 我相信变分 dropout 已经通过 LSTM 层的选项 "recurrent_dropout" 实现,但我找不到任何方法来设置 "training" 标志以像经典的 Dropout 层一样设置为 true。
这在 Keras 中很容易,首先你需要定义一个函数,它接受模型输入和 learning_phase
:
import keras.backend as K
f = K.function([model.layers[0].input, K.learning_phase()],
[model.layers[-1].output])
对于具有多个 inputs/outputs 的函数 API 模型,您可以使用:
f = K.function([model.inputs, K.learning_phase()],
[model.outputs])
然后你可以像f([input, 1])
一样调用这个函数,这将告诉Keras在这个调用期间启用学习阶段,执行Dropout。然后你可以多次调用这个函数并结合预测来估计不确定性。
"Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning" (2015) 的源代码位于 https://github.com/yaringal/DropoutUncertaintyExps/blob/master/net/net.py。他们还使用 Keras,代码非常容易理解。为了传递训练参数,在没有 Sequential api 的情况下使用 Dropout 层。这是 Matias 建议的不同方法:
inter = Dropout(dropout_rate)(inter, training=True)