Добавление исключения к фазе тестирования / вывода

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

    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), но это не так. Оба дают одинаковый результат. Почему так происходит?


person Birish    schedule 11.10.2018    source источник
comment
вы должны сообщить нам, какой фреймворк вы используете. Это Керас?   -  person Jérémy Blain    schedule 11.10.2018
comment
@ JérémyBlain, да, это Керас (обновляет вопрос)   -  person Birish    schedule 11.10.2018
comment
Слой @Birish Dropout активен только во время фазы обучения. На этапе вывода он выключен.   -  person today    schedule 11.10.2018
comment
@today, это был хороший момент! Спасибо! Тогда как мне добавить к тесту отсев? Любая идея?   -  person Birish    schedule 11.10.2018


Ответы (1)


Как я уже упоминал в комментариях, слой 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.]) 
person today    schedule 11.10.2018