Добавление Dropout к фазе тестирования / вывода - PullRequest
0 голосов
/ 11 октября 2018

Я обучил следующую модель для некоторых временных рядов в Керасе:

    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 голосов
/ 11 октября 2018

Как я уже упоминал в комментариях, слой Dropout отключается в фазе вывода (т. Е. В режиме тестирования), поэтому при использовании model.predict() слои Dropout не активны.Однако, если вы хотите иметь модель, которая использует Dropout как на этапе обучения, так и на этапе вывода, вы можете передать аргумент training при его вызове, , как предлагает Франсуа Шолье :

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

В качестве альтернативы, если вы уже обучили свою модель и теперь хотите использовать ее в режиме вывода и оставляете активными слои Dropout (и, возможно, другие слои, которые ведут себя по-разному в фазе обучения / вывода, такие как BatchNormalization), вы можете определить бэкэнд-функцию, которая принимает входные данные модели, а также фазу обучения Keras:

from keras import backend as K

func = K.function(model.inputs + [K.learning_phase()], model.outputs)

# to use it pass 1 to set the learning phase to training mode
outputs = func([input_arrays] + [1.]) 
...