В tensorflow, как перебирать последовательность входов, хранящихся в Тензоре?

Я пытаюсь RNN на задаче классификации многомерных последовательностей переменной длины.

Я определил следующую функцию, чтобы получить выход последовательности (т. е. выход ячейки RNN после окончательного ввода из последовательности)

def get_sequence_output(x_sequence, initial_hidden_state):
    previous_hidden_state = initial_hidden_state
    for x_single in x_sequence:
        hidden_state = gru_unit(previous_hidden_state, x_single)
        previous_hidden_state = hidden_state
    final_hidden_state = hidden_state
    return final_hidden_state

здесь x_sequence является тензором формы (?, ?, 10) где первый ? для размера партии и второго ? для длины последовательности и каждый входной элемент имеет длину 10. gru функция принимает предыдущее скрытое состояние и текущий вход и выплевывает следующее скрытое состояние (стандартная закрытая рекуррентная единица).

Я получаю сообщение об ошибке: 'Tensor' object is not iterable. Как выполнить итерацию по Тензору в последовательности (чтение одного элемента за раз)?

моя цель-применить gru функция для каждого входа из последовательности и получить окончательное скрытое состояние.

2 ответов


вы можете преобразовать тензор в список, используя функцию распаковки, которая преобразует первое измерение в список. Существует также функция split, которая делает что-то подобное. Я использую unstack в модели RNN, над которой я работаю.

y = tf.unstack(tf.transpose(y, (1, 0, 2)))

в этом случае y начинается с shape (BATCH_SIZE, TIME_STEPS, 128) я транспонирую его, чтобы сделать шаги времени внешним измерением, а затем распаковать его в список тензоров, по одному на шаг времени. Теперь каждый элемент в списке y если формы (BATCH_SIZE, 128) и я могу кормить его в свой RNN.


в TF > =1.0,tf.pack и tf.unpack переименованы в tf.stack и tf.unstack соответственно