Tensorflow изображения субтитров / seq2seq декодер как модель - PullRequest
1 голос
/ 05 апреля 2020

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

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

sequence_terminated = False
sequence = np.array((0, output_features))
while not sequence_terminated:
   seq_output, seq_states = model.predict(seq_input)
   next_input, sequence_terminated = f(seq_output)
   sequence = np.concatenate(sequence, seq_output)

. На этом этапе я провел большую оптимизацию, поэтому я могу прогнозировать последовательности для сотен запросов параллельно, но 1) при работе на ЦП он масштабируется линейно при> 32 или около того последовательностях, и 2) работа на ГП на самом деле медленнее, чем на ЦП, предположительно, потому что данные должны перемещаться взад и вперед после каждого шага, и нет никакой прибыли от ГП speed.

Кроме того, я использую поиск не-жадных последовательностей, который не является Beam Search, но может возвращаться назад способом, подобным A *, более или менее таким (псевдокод):

sequence_terminated = False
sequence = np.array((0, output_features))
states = np.array((0, state_size))
pos = []
from_position = 0
remaining_sequences = 5
while remaining_sequences > 0:
   seq_output, seq_states = model.predict(seq_input)
   sequence = np.concatenate(sequence, seq_output)
   states = np.concatenate(states, seq_states)
   pos.append(from_position)
   # Based on the outputs until now, find what sequence stub to continue:
   next_input, next_states, from_position, terminated = f(sequence, states)
   if terminated:
      remaining_sequences = remaining_sequences - 1

, который дает топ-n последовательностей возврат от последней предсказанной позиции. Опять же, это более или менее оптимизировано на стороне процессора для параллельного прогнозирования.

Я думаю, чтобы ускориться, мне нужно полностью запустить прогнозирование на графическом процессоре, не возвращая данные назад. Но я не понимаю, как написать это в TensorFlow. Существует tfa.seq2seq (бывший tf.contrib.seq2seq), который имеет инфраструктуру для декодеров, которые предположительно эффективно работают в качестве моделей, но я не могу найти много документации.

Обратите внимание, что моя модель (функциональный API Keras; она также может быть используется с model() вместо model.predict(), или я могу связать выходные тензоры где-нибудь еще) - это не просто 3 слоя LSTM, но имеет некоторую встроенную конструкцию объектов, которая является состоящей из состояний, поэтому это необходимо сделать в модели. tfa.seq2seq.Decoder, похоже, ожидает, что одна ячейка будет обернута вокруг себя?

Вопросы: 1) Можно ли использовать архитектуру декодера tfa.seq2seq для модели черного ящика, созданной и обученной независимо от архитектуры tfa.seq2seq? Если да, где я могу найти информацию об этом? 2) Существуют ли какие-либо указатели о том, как реализовать поиск по жадным и не жадным последовательностям непосредственно в тензорном потоке, не возвращаясь к коду python, как мой выше? Я понимаю, что мне, вероятно, придется отказаться от своего ненадежного подхода и использовать только поиск луча, который, вероятно, будет работать примерно так же.

...