我正在使用 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 有什么建议吗?