Как получить только последний вывод модели последовательности в Керасе? - PullRequest
0 голосов
/ 07 марта 2019

Я обучил модель последовательности «многие ко многим» в Керасе с оболочкой return_sequences=True и TimeDistributed на последнем плотном слое:

model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=50))
model.add(LSTM(100, return_sequences=True))
model.add(TimeDistributed(Dense(vocab_size, activation='softmax')))
# train...
model.save_weights("weights.h5")

enter image description here

Таким образом, во время обучения потери рассчитываются по всем скрытым состояниям (в каждой отметке времени). Но для вывода мне нужен только вывод get на последней отметке времени. Поэтому я загружаю весовые коэффициенты в модель последовательности «многие к одному» для вывода без оболочки TimeDistributed и устанавливаю return_sequences=False, чтобы получить только последний вывод слоя LSTM:

inference_model = Sequential()
inference_model.add(Embedding(input_dim=vocab_size, output_dim=50))
inference_model.add(LSTM(100, return_sequences=False))
inference_model.add(Dense(vocab_size, activation='softmax'))

inference_model.load_weights("weights.h5")

Когда я проверяю свою модель вывода на последовательности длиной 20, я ожидаю получить прогноз с формой (vocab_size), но inference_model.predict(...) по-прежнему возвращает прогнозы для каждой временной отметки - тензор формы (20, vocab_size)

1 Ответ

0 голосов
/ 07 марта 2019

Если по какой-либо причине вам нужен только последний временной шаг при выводе, вы можете построить новую модель, которая применяет обученную модель к входу и возвращает последний временной шаг в качестве своего вывода, используя слой Lambda:

from keras.models import Model
from keras.layers import Input, Lambda

inp = Input(shape=put_the_input_shape_here)
x = model(inp) # apply trained model on the input
out = Lambda(lambda x: x[:,-1])(x)

inference_model = Model(inp, out)

Side Примечание: Как уже говорилось в , этот ответ , TimeDistributed(Dense(...)) и Dense(...) эквивалентны, так как слой Dense применяется кпоследнее измерение входного тензора.Следовательно, именно поэтому вы получаете ту же форму вывода.

...