Ошибка при построении модели seq2seq с тензорным потоком

Я пытаюсь понять модели seq2seq, определенные в seq2seq.py в тензорном потоке. Я использую биты кода, который я копирую из примера translate.py, который поставляется с тензорным потоком. Я продолжаю получать ту же ошибку и действительно не понимаю, откуда она взялась.

Минимальный пример кода для воспроизведения ошибки:

import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
from tensorflow.models.rnn import seq2seq

encoder_inputs = []
decoder_inputs = []
for i in xrange(350):  
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                              name="encoder{0}".format(i)))

for i in xrange(45):
    decoder_inputs.append(tf.placeholder(tf.int32, shape=[None],
                                         name="decoder{0}".format(i)))

model = seq2seq.basic_rnn_seq2seq(encoder_inputs,
                                  decoder_inputs,rnn_cell.BasicLSTMCell(512))

Ошибка, которую я получаю при оценке последней строки (я оценил ее интерактивно в интерпретаторе python):

    >>>  Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/tmp/py1053173el", line 12, in <module>
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/seq2seq.py", line 82, in basic_rnn_seq2seq
        _, enc_states = rnn.rnn(cell, encoder_inputs, dtype=dtype)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn.py", line 85, in rnn
        output_state = cell(input_, state)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/rnn_cell.py", line 161, in __call__
        concat = linear.linear([inputs, h], 4 * self._num_units, True)
      File "/usr/local/lib/python2.7/dist-packages/tensorflow/models/rnn/linear.py", line 32, in linear
        raise ValueError("Linear is expecting 2D arguments: %s" % str(shapes))
    ValueError: Linear is expecting 2D arguments: [[None], [None, 512]]

Я подозреваю, что ошибка приходит с моей стороны:) На боковой стенке. Документация и учебники действительно велики, но примерный код последовательности для последовательности (пример перевода с английского на французский) довольно плотный. Вы также должны много прыгать между файлами, чтобы понять, что происходит. Я, по крайней мере, несколько раз терялся в коде.

В этом случае действительно полезен минимальный пример (возможно, по некоторым данным игрушек) построения и обучения базовой модели seq2seq. Кто-нибудь знает, что это уже где-то существует?

ИЗМЕНИТЬ Я исправил код выше в соответствии с предложениями @Ishamael (это означает, что ошибки не возвращаются) (см. Ниже), но в этой фиксированной версии все еще есть некоторые вещи, которые не ясны. Мой вход представляет собой последовательность векторов длины 2 вещественных значений. И мой вывод представляет собой последовательность двоичных векторов длиной 22. Должен ли мой код tf.placeholder выглядеть не следующим образом? (EDIT да)

tf.placeholder(tf.float32, shape=[None,2],name="encoder{0}".format(i))
tf.placeholder(tf.float32, shape=[None,22],name="encoder{0}".format(i))

Мне также пришлось изменить tf.int32 на tf.float32 выше. Поскольку мой вывод двоичный. Должно ли это не быть tf.int32 для tf.placeholder моего декодера? Но тензорный поток снова жалуется, если я это сделаю. Я не уверен, что за этим стоит.

Размер моего скрытого слоя здесь равен 512.

полный фиксированный код

import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
from tensorflow.models.rnn import seq2seq

encoder_inputs = []
decoder_inputs = []
for i in xrange(350):  
    encoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512],
                                          name="encoder{0}".format(i)))

for i in xrange(45):
    decoder_inputs.append(tf.placeholder(tf.float32, shape=[None,512],
                                         name="decoder{0}".format(i)))

model = seq2seq.basic_rnn_seq2seq(encoder_inputs,
                                  decoder_inputs,rnn_cell.BasicLSTMCell(512))

Ответы

Ответ 1

Большинство моделей (seq2seq не является исключением) ожидают, что их ввод будет в пакетах, поэтому, если форма вашего логического ввода [n], то форма тензора, которую вы будете использовать в качестве входа в свою модель должна быть [batch_size x n]. На практике первое измерение формы обычно не учитывается как None и определяется как размер партии во время выполнения.

Поскольку логический вход в seq2seq является вектором чисел, фактическая форма тензора должна быть [None, input_sequence_length]. Таким образом, фиксированный код будет выглядеть по строкам:

input_sequence_length = 2; # the length of one vector in your input sequence

for i in xrange(350):  
    encoder_inputs.append(tf.placeholder(tf.int32, shape=[None, input_sequence_length],
                                              name="encoder{0}".format(i)))

(и затем то же самое для декодера)

Ответ 2

В модуле перевода есть метод самотестирования, который показывает его минимальное использование. [здесь]

Я просто использовал метод самотестирования, используя.

python translate.py --self_test 1