Я пытаюсь применить моделирование от последовательности к последовательности к данным ЭЭГ. Кодирование работает просто отлично, но заставить работать декодирование проблематично. Входные данные имеют форму 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')
Есть идеи?