Как отключить отсева при прогнозировании в керасе?

Я использую исключение в нейронной сети в keras. Маленький код похож на

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

Для тестирования я использую preds = model_1.predict_proba(image).

Но при тестировании Dropout также участвует в прогнозировании оценки, которой не должно быть. Я много искал, чтобы отключить выпад, но пока не получил никакого намека.

У кого-нибудь есть решение отключить Dropout при тестировании в keras??

Ответ 1

Keras делает это по умолчанию. Отключение Keras отключено в тестовом режиме. Вы можете посмотреть здесь код и посмотреть, что они используют сброшенный ввод в процессе обучения и фактический ввод во время тестирования.

Насколько я знаю, вы должны создать свою собственную функцию обучения из слоев и указать флаг обучения для прогнозирования с выпадением (например, невозможно указать флаг обучения для функций прогнозирования). Это проблема, если вы хотите использовать GAN, которые используют промежуточный выход для обучения, а также обучают сеть в целом из-за расхождения между созданными образовательными изображениями и сгенерированными тестовыми изображениями.

Ответ 2

Как указывалось ранее, отсев в Керасе происходит только во время тренировки (с пропорциональной корректировкой веса во время тренировки так, чтобы выученные веса подходили для прогнозирования, когда выпадение отключено).

Это не идеально для случаев, когда мы хотим использовать выпадающий NNET в качестве вероятностного предиктора (такой, что он генерирует распределение при повторном прогнозировании одних и тех же входных данных). Другими словами, слой Keras 'Dropout' предназначен для того, чтобы дать вам регуляризацию во время обучения, но "среднюю функцию" изученного распределения при прогнозировании.

Если вы хотите сохранить отсев для прогноза, вы можете легко внедрить слой постоянного выпадения ("PermaDropout") (это было основано на предложениях, высказанных Ф. Чолле в области обсуждения GitHub для Keras):

from keras.layers.core import Lambda
from keras import backend as K

def PermaDropout(rate):
    return Lambda(lambda x: K.dropout(x, level=rate))

Заменив любой выпадающий слой в модели Keras на "PermaDropout", вы также получите вероятностное поведение в прогнозировании.

# define the LSTM model
n_vocab = text_to_train.n_vocab

model = Sequential()
model.add(LSTM(n_vocab*4, 
          input_shape=input_shape, 
          return_sequences=True))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
model.add(LSTM(n_vocab*2))
# Replace Dropout with PermaDropout
# model.add(Dropout(0.3)
model.add(PermaDropout(0.3))
#model.add(Dense(n_vocab*2))
model.add(Dense(n_vocab, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Ответ 3

Выпадение удаляет определенные формы нейронов, и, чтобы компенсировать это, мы обычно принимаем один из двух способов.

  1. масштабирование активации во время тестирования
  2. инвертирования выбытия на этапе обучения

И керас использует вторую форму коррекции, как вы можете видеть здесь

Ответ 4

Вот ожидаемый способ сделать это.

Keras слои имеют дополнительный параметр training - если вы передаете его, как True, отсев работает при вызове the_model.predict(...) и the_model.evaluate(...).

Обратите внимание, что он также работает для recurrent_dropout слоев LSTM.

the_input = Input(shape=the_input_shape, name=the_input_name)
the_layer = LSTM(recurrent_dropout=0.5)(the_input, training=True)
the_layer = Dense(10)(the_layer)
the_layer = Dropout(0.5)(the_layer, training=True)
the_layer = Softmax()(the_layer)

the_model = Model(inputs=[the_input], outputs=[the_layer])

Ответ 5

Вы можете изменить отсев в обученной модели (с выпадающими слоями):

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

Таким образом, вам не нужно снова тренировать модель !!!