Seq2seq для не-предложения, плавающие данные; попробую настроить декодер - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь применить моделирование от последовательности к последовательности к данным ЭЭГ. Кодирование работает просто отлично, но заставить работать декодирование проблематично. Входные данные имеют форму None -by-3000-by-31, где второе измерение - это длина последовательности.

Кодировщик выглядит так:

initial_state = lstm_sequence_encoder.zero_state(batchsize, dtype=self.model_precision)

encoder_output, state = dynamic_rnn(
     cell=LSTMCell(32),
     inputs=lstm_input, # shape=(None,3000,32)
     initial_state=initial_state, # zeroes
     dtype=lstm_input.dtype # tf.float32
)

Я использую конечное состояние RNN в качестве начального состояния декодера. Для обучения я использую TrainingHelper:

training_helper = TrainingHelper(target_input, [self.sequence_length])
training_decoder = BasicDecoder(
     cell=lstm_sequence_decoder,
     helper=training_helper,
     initial_state=thought_vector
)
output, _, _ = dynamic_decode(
     decoder=training_decoder,
     maximum_iterations=3000
)

Мои проблемы начинаются, когда я пытаюсь осуществить вывод. Поскольку я использую данные, не относящиеся к предложению, мне не нужно токенизировать или встраивать, потому что данные уже встроены. Класс InferenceHelper казался лучшим способом достижения моей цели. Так что это то, что я использую. Я дам свой код, затем объясню мою проблему.

def _sample_fn(decoder_outputs):
     return decoder_outputs
def _end_fn(_):
     return tf.tile([False], [self.lstm_layersize]) # Batch-size is sequence-length because of time major
inference_helper = InferenceHelper(
     sample_fn=_sample_fn,
     sample_shape=[32],
     sample_dtype=target_input.dtype,
     start_inputs=tf.zeros(batchsize_placeholder, 32), # the batchsize varies
     end_fn=_end_fn
)
inference_decoder = BasicDecoder(
     cell=lstm_sequence_decoder,
     helper=inference_helper,
     initial_state=thought_vector
)
output, _, _ = dynamic_decode(
     decoder=inference_decoder,
     maximum_iterations=3000
)

Проблема

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

Я также подумал, что должен передать результат каждого временного шага без изменений следующему. Однако это вызывает проблемы во время выполнения: размер пакета варьируется, поэтому форма является частичной. Библиотека выдает исключение при попытке преобразовать start_input в тензор:

...
self._start_inputs = ops.convert_to_tensor(
      start_inputs, name='start_inputs')

Есть идеи?

1 Ответ

0 голосов
/ 25 июня 2018

Это урок плохой документации.

Я исправил свою проблему, но не смог решить проблему с переменным размером пакета.

_end_fn вызывал проблемы, о которых я не знал,Мне также удалось выяснить, какие соответствующие поля для InferenceHelper.Я дал имена полей на случай, если кому-то понадобится руководство в будущем

 def _end_fn(_):
      return tf.tile([False], [batchsize])
 inference_helper = InferenceHelper(
      sample_fn=_sample_fn,
      sample_shape=[lstm_number_of_units], # In my case, 32
      sample_dtype=tf.float32, # Depends on the data
      start_inputs=tf.zeros((batchsize, lstm_number_of_units)),
      end_fn=_end_fn
 )

Что касается проблемы с размером партии, я рассматриваю две вещи:

  1. Изменение внутреннего состояния моего модельного объекта. Мой расчетный график TensorFlow построен внутри класса.Поле класса записывает размер пакета.Изменение этого во время обучения может работать.Или:

  2. Дополните партии так, чтобы они имели длину 200 последовательностей. Это приведет к потере времени.

Желательно IМне бы хотелось динамически управлять размерами партии.

РЕДАКТИРОВАТЬ: Я нашел способ.Он включает в себя простую замену квадратных скобок скобками:

 inference_helper = InferenceHelper(
      sample_fn=_sample_fn,
      sample_shape=[self.lstm_layersize],
      sample_dtype=target_input.dtype,
      start_inputs=tf.zeros([batchsize, self.lstm_layersize]),
      end_fn=_end_fn
 )
...