0

我正在使用 Keras 功能 API 来构建分类器,并training在预测新实例时使用 dropout 层中的标志来启用 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 有什么建议吗?

4

1 回答 1

0

当然,您不需要在构建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])
于 2019-08-18T18:47:18.423 回答