Я обучил модель последовательности «многие ко многим» в Керасе с оболочкой 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")
Таким образом, во время обучения потери рассчитываются по всем скрытым состояниям (в каждой отметке времени). Но для вывода мне нужен только вывод 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)