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

时间:2017-12-13 06:41:14

标签: machine-learning neural-network deep-learning keras keras-layer

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

model.add(Dropout(0.5))
model.add(Dense(classes))

进行测试时,我使用的是preds = model_1.predict_proba(image)

但是,测试 Dropout 也参与预测不应该发生的分数。我经常搜索以禁用丢失但是还没有得到任何提示。

有没有人有解决方案在keras中测试时禁用 Dropout

4 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:2)

辍学将某些神经元从游戏中移除,为了弥补这一点,我们通常采取两种方式之一。

  1. 在测试时缩放激活
  2. 在训练阶段反转辍学
  3. keras使用第二种形式的修正,你可以看到here

答案 2 :(得分:1)

您可以在经过训练的模型(具有辍学层)中更改辍学:

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

通过这种方式,您无需再次训练模型!

答案 3 :(得分:0)

由于较新的 Tensorflow 版本通常非常渴望,您可以尝试以下操作:

train_prediction = model_or_layer(input_data_numpy, training=True)
test_prediction = model_or_layer(input_data_numpy, training=False)

这将为您提供考虑到所需阶段行为的预测。 对于自定义训练循环(而不是 model.fit,您进行急切预测并自己应用梯度),使用此方法很重要:

#training
for batchX, batchY in data_generator:
    with with tf.GradientTape() as tape:
       train_outputs = model(batchX, training=True)
       loss = some_loss(batchY, train_outputs)
    gradients = tape.gradient(loss, model.trainable_weights)
    optimizer.apply_gradients(zip(gradients, model.trainable_weights))

#validating
for batchX, batchY in val_generator:
    val_outputs = model(batchX, training=False)
    #calculate metrics

我从未测试过以下内容,但在非急切模式下,您也可以使用现有层构建新模型,但将 training=False 传递给调用(函数式 API 模型):

#if using an existing layer
output_symbolic_tensor = someExistingLayer(input_symbolic_tensor, training=True) 

#if you're creating a new layer now
output_symbolic_tensoe = SomeLayer(*layer_params)(input_symbolic_tensor, training=True)