将Dropout添加到测试/推断阶段

时间:2018-10-11 09:07:26

标签: python neural-network keras deep-learning dropout

我已经在Keras中为某些时间序列训练了以下模型:

    input_layer = Input(batch_shape=(56, 3864))
    first_layer = Dense(24, input_dim=28, activation='relu',
                        activity_regularizer=None,
                        kernel_regularizer=None)(input_layer)
    first_layer = Dropout(0.3)(first_layer)
    second_layer = Dense(12, activation='relu')(first_layer)
    second_layer = Dropout(0.3)(second_layer)
    out = Dense(56)(second_layer)
    model_1 = Model(input_layer, out)

然后,我用受过训练的model_1层定义了一个新模型,并以不同的速率drp向其添加了辍学层:

    input_2 = Input(batch_shape=(56, 3864))
    first_dense_layer = model_1.layers[1](input_2)
    first_dropout_layer = model_1.layers[2](first_dense_layer)
    new_dropout = Dropout(drp)(first_dropout_layer)
    snd_dense_layer = model_1.layers[3](new_dropout)
    snd_dropout_layer = model_1.layers[4](snd_dense_layer)
    new_dropout_2 = Dropout(drp)(snd_dropout_layer)
    output = model_1.layers[5](new_dropout_2)
    model_2 = Model(input_2, output)

然后我将得到以下两个模型的预测结果:

result_1 = model_1.predict(test_data, batch_size=56)
result_2 = model_2.predict(test_data, batch_size=56)

我期望得到完全不同的结果,因为第二个模型具有新的辍学层,并且这两个模型是不同的(IMO),但事实并非如此。两者都产生相同的结果。为什么会这样呢?

1 个答案:

答案 0 :(得分:2)

正如我在评论中所提到的,Dropout层在推断阶段(即测试模式)处于关闭状态,因此,当您使用model.predict()时,Dropout层将不活动。但是,如果您希望有一个在训练和推断阶段都使用Dropout的模型,则可以在调用as suggested by François Chollet时传递training参数,

# ...
new_dropout = Dropout(drp)(first_dropout_layer, training=True)
# ...

或者,如果您已经训练了模型,现在想在推理模式下使用它并保留Dropout层(以及可能在训练/推断阶段具有不同行为的其他层,例如{{1} })有效,您可以定义一个后端函数,该函数接受模型的输入以及Keras学习阶段:

BatchNormalization