【问题标题】:Question about enabling/disabling dropout with keras functional API关于使用 keras 功能 API 启用/禁用 dropout 的问题
【发布时间】:2019-08-18 18:31:43
【问题描述】:

我正在使用 Keras 功能 API 来构建分类器,并且我在 dropout 层中使用 training 标志来在预测新实例时启用 dropout(以便获得对不确定性的估计)。为了得到预期的响应,需要多次重复这个预测,使用 keras 随机激活密集层中的链接,当然它的计算成本很高。因此,我还希望可以选择在预测阶段不使用 dropout,即使用所有网络链接。有谁知道我该怎么做?以下是我正在做的示例代码。我试图查看predict 是否有任何相关参数,但似乎没有(?)。从技术上讲,我可以在 dropout 层没有训练标志的情况下训练相同的模型,但我不想这样做(或者更好的是我想要一个更干净的解决方案,而不是拥有 2 个不同的模型)。

from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.utils import to_categorical
from keras.layers import Dense
from keras.layers import Dropout
import numpy as np
import keras

# generate a 2d classification sample dataset
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
trainy = to_categorical(trainy)
testy = to_categorical(testy)

inputlayer = keras.layers.Input((2,))

d = keras.layers.Dense(500, activation = 'relu')(inputlayer)
d1 = keras.layers.Dropout(rate = .3)(d,training = True)
out = keras.layers.Dense(2, activation = 'softmax')(d1)

model = keras.Model(inputs = inputlayer, outputs = out)

model.compile(loss = 'categorical_crossentropy',metrics = ['accuracy'],optimizer='adam')
model.fit(x = trainX, y = trainy, validation_data=(testX, testy),epochs=1000, verbose=1)

# another prediction on a specific sample 
print(model.predict(testX[0:1,:]))
# another prediction on the same sample
print(model.predict(testX[0:1,:]))

运行上面的示例,我得到以下输出:

[[0.9230819  0.07691813]]
[[0.8222245  0.17777553]]

正如预期的那样,相同输入的不同类别概率,因为存在来自 dropout 层的链接的随机(去)激活。

关于如何使用功能 API 在预测阶段启用/禁用 dropout 有什么建议吗?

【问题讨论】:

标签: keras functional-programming dropout


【解决方案1】:

当然,在构建Dropout 层时不需要设置训练标志。训练模型后,您定义此函数:

mc_func = K.function([model.input, K.learning_phase()],
                     [model.output])

然后您调用mc_func 并使用您的输入和标志 1 来启用 dropout,或 0 来禁用它:

stochastic_pred = mc_func([some_input, 1])
deterministic_pred = mc_func([some_input, 0])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2018-11-10
    • 2018-11-19
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多