2016-04-17 4 views
2

Я пытаюсь создать рекуррентную нейронную сеть в тензорном потоке. Вход в сеть представляет собой последовательность векторов. Длина последовательности различна для всех входов. Я хочу сделать это с помощью партии входов.Как создать рекуррентную нейронную сеть в тензорном потоке для переменной длины последовательности?

Может ли кто-нибудь помочь мне в том, как именно это сделать? Я прошел учебники на сайте tensorflow, но мне все еще не ясно.

+0

Это https://github.com/tensorflow/tensorflow/tree/master/tensorflow/models/rnn модель делает то, что вы хотите (для ranslation в данном случае) – Ashish

+0

Привет Ashish, Я попытался пройти через этот код прежде чем задавать этот вопрос. Но я не мог точно понять, как это происходит? Не возражаете ли вы указывать на нужное место в коде. благодаря – akshaybetala

ответ

1

Вы можете использовать функцию РНН определенный here

Один из аргументов он принимает это sequence_length

sequence_length: Определяет длину каждой последовательности входов. Размер вектора int32 или int64 (тензор) [batch_size]. Значения в [0, T).

Вот как реализовать полный цикл

# x, state, sequence_length are placeholders 
outputs, final_state = tf.nn.rnn(lstm_cell, x, state, sequence_length = sequence_lengths) 
# add softmax layer, define loss, training method, etc 
... 

# code for one epoch 
iterations = total_data_length/batch_size 
max_sequence_length = max(all_possible_sequence_lengths) 
cur_state = initial_state 

for i in range(iterations): 
    # x is of dimension [max_sequence_length, batch_size, input_size] 
    # sequence_lengths is of dimension [batch_size] 
    x_data, sequence_data, y_data = mini_batch(batch_size) 

    feed_dict = {k: v for k, v in zip(x, x_data)} 
    feed_dict.append(sequence_lengths: sequence_data, ...) 
    outs, cur_state, _ = session.run([outputs, final_state, train], feed_dict) 

Этот метод был немного запутанным мне за пару причин:

  1. Входная форма [sequence_length, batch_size, input_size] и не [batch_size, sequence_length, input_size]. Однако это имеет смысл, если вы переходите через код и видите, как реализуется rnn(). Это также означает, что вам необходимо изменить ваши выходы (имеющие размеры, такие же, как и входы), чтобы передать их в matmul, а затем softmax, например.
  2. Входы параметров в функции rnn() - список python. И вы не можете передать это в feed_dict как {x: x_data}, вы получите сообщение об ошибке «Невозможно использовать хэш-тип:« list »». Вместо этого посмотрите, как я использовал понимание в коде выше.
0

Это зависит от набора данных, но вы можете сделать:

  1. Используйте максимальную длину в наборе данных, или
  2. Используйте разумный размер (например, 256) и разделяет входные данные до размер, если они длиннее размера.
Смежные вопросы