Я хотел бы создать модель Seq2Seq для прогнозирования данных временных рядов. Я использую InferenceHelper, и я борюсь с параметром sample_fn
. Я хотел бы передать выход декодера каждой ячейки через плотный слой, чтобы генерировать один выход на каждом временном шаге. Поэтому я предоставляю функцию, которая делает это с параметром sample_fn
.
Позже я хотел бы объединить выходные данные ячейки rnn с другими функциями, не относящимися к временным рядам, и создать поверх них более плотные слои.
Сеть работает нормально во время обучения, но не во время вывода. Я думаю, что это связано с тем, что я не разделяю один и тот же плотный слой между тренировкой и временем вывода.
Я попытался установить параметр повторного использования и использовал среду with tf.variable_scope()
. Однако sample_fn
уже вызывается в определенной области действия в dynamic_decode
, и поэтому я не могу использовать ту же область, что и во время обучения.
Соответствующая часть моего кода выглядит следующим образом:
Заполнители:
inputs = tf.placeholder(shape=(None, 100, 1), dtype=tf.float32, name='inputs')
input_lengths = tf.placeholder(shape=(None,), dtype=tf.int32, name='input_lengths')
targets = tf.placeholder(shape=(None, 100), dtype=tf.float32, name='targets')
target_lengths = tf.placeholder(shape=(None,), dtype=tf.int32, name='target_lengths')
Кодировщик:
encoder_cell = tf.nn.rnn_cell.MultiRNNCell([tf.contrib.rnn.GRUCell(num_units=16, name='encoder_cell_0'])
self.decoder_cell = tf.nn.rnn_cell.MultiRNNCell([tf.contrib.rnn.GRUCell(num_units=16, name='decoder_cell_0']))
_, final_encoder_states = tf.nn.dynamic_rnn(cell=encoder_cell, inputs=inputs,
sequence_length=input_lengths, dtype=tf.float32)
Декодер (обучающий)
start_tokens = tf.fill([tf.shape(inputs)[0]], start_token)
start_tokens = tf.cast(tf.expand_dims(start_tokens, 1), dtype=tf.float32)
targets_as_inputs = tf.concat([start_tokens, targets], axis=1)
targets_as_inputs = tf.reshape(targets_as_inputs, (-1, targets_as_inputs.shape[1], 1))
training_helper = tf.contrib.seq2seq.TrainingHelper(inputs=targets_as_inputs, sequence_length=target_lengths, name='training_helper')
training_decoder = tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell, helper=training_helper, initial_state=final_encoder_states)
train_outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder=training_decoder, maximum_iterations=max_target_sequence_length, impute_finished=True)
train_predictions = train_outputs.rnn_output
train_predictions = tf.layers.dense(train_predictions, 1, activation=None, name='output_dense_layer')
Декодер (логический вывод). Неверная часть:
def sample_fn(outputs):
return tf.layers.dense(outputs, 1, activation=None,
name='output_dense_layer', reuse=tf.AUTO_REUSE)
infer_helper = tf.contrib.seq2seq.InferenceHelper(sample_fn=sample_fn, sample_shape=(1),
sample_dtype=tf.float32, start_inputs=start_tokens, end_fn=lambda sample_ids: False, next_inputs_fn=None)
infer_decoder = tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell, helper=infer_helper, initial_state=final_encoder_states)
infer_outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder=infer_decoder, maximum_iterations=max_target_sequence_length, impute_finished=True)
infer_predictions = infer_outputs.rnn_output
infer_predictions = sample_fn(infer_predictions)
Есть похожий вопрос: Как использовать tenorflow seq2seq без вложений?
Автор использует sample_fn=lambda outputs: outputs
. Но это возвращает ValueError в моем случае, потому что размеры не совпадают. Как они могли с несколькими клетками? sample_fn
должно возвращать одно значение.