Активировать рекуррентное выпадение при оценке модели с использованием tf.Keras.Последовательный API и LSTM

#tensorflow #machine-learning #keras

#tensorflow #машинное обучение #keras

Вопрос:

Я предварительно обучил кодировщик / декодер LSTM без использования отсева, чтобы я мог использовать графический процессор и ускорить обучение. Теперь я перестроил модель и добавил отсев и рекуррентный отсев и хотел бы активировать это во время вывода, чтобы оценить доверительный интервал для моих прогнозов. Я не уверен, где и как добавить аргумент training = True в мою модель с использованием sequential API. Я думал, что смогу сделать это при оценке модели, но, похоже, это не так:

 encoder_decoder_dropout.evaluate(val, steps=VALIDATION_STEPS, training=True)

evaluate() got an unexpected keyword argument 'training'
  

Моя модель приведена ниже. Любые предложения о том, как активировать выпадение во время вывода, были бы очень признательны.

 encoder = encoder_decoder_dropout_trained.layers[0]

decoder_dropout = tf.keras.Sequential([
  tf.keras.layers.RepeatVector(look_back, input_shape=[60]),
  tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(100, dropout=0.2,
                                                     recurrent_dropout=0.2,
                                                     return_sequences=False)), 
  tf.keras.layers.Dense(look_forward*num_features,
                        kernel_initializer=tf.initializers.glorot_normal()),
  tf.keras.layers.Reshape([look_forward, num_features])
], name = 'decoder')

encoder_decoder_dropout = tf.keras.Sequential([encoder, decoder_dropout])
encoder_decoder_dropout.set_weights(encoder_decoder_dropout_trained.get_weights()) 
  

Ответ №1:

Чтобы активировать выпадение на время вывода, вам просто нужно указать training=True в интересующем слое (в вашем случае в lstm)

с помощью training=False

 inp = Input(shape=(10, 1))
x = LSTM(1, recurrent_dropout=0.3)(inp, training=False)
m = Model(inp,x)
# m.compile(...)
# m.fit(...)

X = np.random.uniform(0,1, (1,10,1))

output = []
for i in range(0,100):
    output.append(m.predict(X)) # always the same
  

с помощью training=True

 inp = Input(shape=(10, 1))
x = LSTM(1, recurrent_dropout=0.3)(inp, training=True)
m = Model(inp,x)
# m.compile(...)
# m.fit(...)

X = np.random.uniform(0,1, (1,10,1))

output = []
for i in range(0,100):
    output.append(m.predict(X)) # always different
  

для этого необходимо использовать функциональный формат keras

Комментарии:

1. Спасибо. Основная причина, по которой я спрашивал, заключается в том, что я объединяю две модели, а кодирующая часть была написана с использованием последовательного API. На самом деле я не знал, что вы можете комбинировать эти две модели (последовательную и функциональную), но, просто попробовав, я вижу, что вы можете.