如何在keras中预测时禁用丢失?

Akh*_*esh 14 machine-learning neural-network deep-learning keras keras-layer

我在keras的神经网络模型中使用dropout.一点点代码就好

model.add(Dropout(0.5))
model.add(Dense(classes))
Run Code Online (Sandbox Code Playgroud)

为了测试,我正在使用preds = model_1.predict_proba(image).

但是,虽然测试Dropout也参与预测不应该发生的分数.我搜索了很多来禁用丢失但是没有得到任何提示.

有人有解决方案在keras测试时禁用Dropout吗?

Tho*_*etz 29

Keras默认情况下这样做.在Keras中,在测试模式下禁用了丢失.您可以在这里查看代码,看看他们在测试中使用了训练中的丢弃输入和测试时的实际输入.

据我所知,你必须从各层建立自己的训练功能,并指定训练标志以预测辍学(例如,不可能为预测功能指定训练标志).如果您想要使用中间输出进行训练并且还训练整个网络,由于生成的训练图像和生成的测试图像之间的差异,这是一个问题.


T3a*_*ark 8

如前所述,Keras中的丢失仅在训练时发生(在训练期间具有相应的权重调整,使得学习的权重适合于在禁用丢失时的预测).

对于我们希望使用辍学NNET作为概率预测器(当要求重复预测相同输入时产生分布)的情况,这并不理想.换句话说,Keras的Dropout图层旨在为您提供训练时的正规化,但是在预测时是学习分布的"平均函数".

如果你想保留预测的辍学率,你可以轻松实现永久性辍学("PermaDropout")层(这是基于F. Chollet在Keras的GitHub讨论区提出的建议):

from keras.layers.core import Lambda
from keras import backend as K

def PermaDropout(rate):
    return Lambda(lambda x: K.dropout(x, level=rate))
Run Code Online (Sandbox Code Playgroud)

通过使用"PermaDropout"替换Keras模型中的任何丢失层,您也将获得预测中的概率行为.

# define the LSTM model
n_vocab = text_to_train.n_vocab

model = Sequential()
model.add(LSTM(n_vocab*4, 
          input_shape=input_shape, 
          return_sequences=True))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
model.add(LSTM(n_vocab*2))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
#model.add(Dense(n_vocab*2))
model.add(Dense(n_vocab, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)


Mar*_*ani 5

要激活推理时间的 dropout,您只需training=True在感兴趣的层中指定(Dropout在我们的例子中):

training=False

inp = Input(shape=(10,))
x = Dropout(0.3)(inp, training=False)
x = Dense(1)(x)
m = Model(inp,x)
# m.compile(...)
# m.fit(...)

X = np.random.uniform(0,1, (1,10))

output = []
for i in range(0,100):
    output.append(m.predict(X)) # always the same
Run Code Online (Sandbox Code Playgroud)

training=True

inp = Input(shape=(10,))
x = Dropout(0.3)(inp, training=True)
x = Dense(1)(x)
m = Model(inp,x)
# m.compile(...)
# m.fit(...)

X = np.random.uniform(0,1, (1,10))

output = []
for i in range(0,100):
    output.append(m.predict(X)) # always different
Run Code Online (Sandbox Code Playgroud)

默认情况下,训练设置为 False

这是推理时使用 dropout 的完整示例

  • 嗨德鲁,谢谢!这行简单的代码仅允许训练后在网络中激活 dropout(您的预测每次都会不同!)。通过 Keras 中的这个技巧,可以使用引导迭代预测来估计预测不确定性。要深入了解该理论,我建议您看一下这篇论文:https://arxiv.org/pdf/1709.01907.pdf 以及有关该主题的相关参考文献。 (2认同)