【问题标题】:Keras forward pass with dropoutKeras 前向传球与辍学
【发布时间】:2017-11-05 04:06:23
【问题描述】:

我正在尝试使用 dropout 为神经网络获取 error estimates

这涉及在训练后运行我的网络的几次前向传递,并激活 dropout。但是,调用 model.predict() 时似乎没有激活 Dropout。这可以在 Keras 中完成,还是我必须在其他地方举重?

【问题讨论】:

标签: tensorflow machine-learning keras dropout


【解决方案1】:

可以使用 keras 后端功能实现随机前向传递(在测试期间使用 dropout)。假设您有一个训练有素的神经网络,称为model

from keras import backend as K

nb_MC_samples = 100
MC_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output])

learning_phase = True  # use dropout at test time
MC_samples = [MC_output([x_test, learning_phase])[0] for _ in xrange(nb_MC_samples)]
MC_samples = np.array(MC_samples)  # [#samples x batch size x #classes]

如需完整实施,请参阅以下ipython notebook

【讨论】:

    【解决方案2】:

    它已经在 Keras 中完成,参见例如this discussion 在项目页面上。更多关于它如何工作的信息可以在 CS231n: Convolutional Neural Networks for Visual Recognition 中找到——AFAIK 一个非常相似的实现是在 Keras 中。具体来说:

    (...) 至关重要的是,请注意,在 predict 函数中,我们没有丢弃 不再,但我们正在执行两个隐藏层输出的缩放 由 pp. 这很重要,因为在测试时所有神经元都能看到 他们的输入,所以我们希望测试时神经元的输出是 与他们在训练时的预期输出相同。

    【讨论】:

    • 在获得错误估计时,我需要进行随机前向传递。 IE。每次使用不同的 dropout 掩码运行 100 次前向传球。但在预测期间似乎没有神经元被丢弃
    • 当然,这正是这里的代码所说的:github.com/fchollet/keras/blob/master/keras/layers/core.py#L110 - 在测试/预测阶段,不使用 dropout。相反,应用了比例权重。如果您想在两个方向都有明确的 Dropout,您可以使用 Lambda 定义自己的版本。
    • 他希望在两个方向上都明确 Dropout,也就是说,他希望能够在测试时应用 dropout,而不是使用比例权重。
    猜你喜欢
    • 2020-09-28
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多