我目前正在尝试使用Keras(tensorflow后端)建立一个(LSTM)递归神经网络。我想在上面使用带有 MC Dropout 的变分辍学。我相信变分辍学已经使用 LSTM 层的选项"recurrent_dropout"实现,但我找不到任何方法可以像经典的 Dropout 层那样设置一个"训练"标志来放置
这在 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。然后,您可以多次调用此函数并组合预测以估计不确定性。
"Dropout as a Bayesian Approximation: RepresentationModel Uncertainin Deep Learning"(2015)的源代码位于 https://github.com/yaringal/DropoutUncertaintyExps/blob/master/net/net.py。他们还使用Keras,代码很容易理解。在没有顺序 api 的情况下使用 Dropout 层,以便传递训练参数。这是对Matias建议的不同方法:
inter = Dropout(dropout_rate)(inter, training=True)