我在keras的神经网络模型中使用dropout。一点点代码就像
model.add(Dropout(0.5))
model.add(Dense(classes))
进行测试时,我使用的是preds = model_1.predict_proba(image)
。
但是,测试 Dropout 也参与预测不应该发生的分数。我经常搜索以禁用丢失但是还没有得到任何提示。
有没有人有解决方案在keras中测试时禁用 Dropout ?
答案 0 :(得分:23)
Keras默认情况下这样做。在Keras中,在测试模式下禁用了丢失。您可以查看代码here,看看他们在测试中使用了丢弃的输入和测试时的实际输入。
据我所知,您必须从各层构建自己的训练功能,并指定训练标志以预测丢失(例如,不可能为预测功能指定训练标志)。如果你想做GAN,这是一个问题,由于生成的训练图像和生成的测试图像之间的差异,你需要使用中间输出进行训练并整体训练网络。
答案 1 :(得分:2)
辍学将某些神经元从游戏中移除,为了弥补这一点,我们通常采取两种方式之一。
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)