В 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.