14

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

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

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. Кто-нибудь знает, что это уже существует?

EDIT Я установил код, указанный выше в соответствии предложения @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)) 
+0

Я пытаюсь научиться seq2seq в ТФ прямо сейчас. Является ли 350 размером вокала вашего кодировщика и 45 размером слова вашего декодера? – Soubriquet

ответ

8

Большинство моделей (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))) 

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

+0

спасибо, что помогли мне! Я отредактировал свой вопрос выше в соответствии с вашими предложениями и добавил дополнительный вопрос: 512 - это размер моего скрытого слоя. в tf.placeholder должен отражать размер моего вектора ввода и вывода, а не размер скрытого слоя? – user1782011

+0

Да, я подозревал, что это не должно быть 512, но сообщение об ошибке смутило меня :) Думаю, я неправильно понял. То, как вы исправили свой код, на самом деле правильное. Я не уверен в проблеме 'int32' vs' float', но заметьте, что 'basic_rnn_seq2seq' имеет аргумент' dtype', который по умолчанию имеет 'float32'. Попробуйте установить его на 'int32', а затем измените свой ввод на' int32', но я не полностью понимаю этот параметр, так что это просто предположение. – Ishamael

+0

Кроме того, как правило, рекомендуется задавать новые вопросы, когда вы сталкиваетесь с новыми проблемами, а не редактируете вопрос, чтобы ответы и вопросы оставались простыми и охватывали одну проблему, когда люди их искали. – Ishamael

1

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

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

python translate.py --self_test 1 
+0

Эй, самотестирование действительно полезно; Но мои основные пункты боли в seq2seq_model.py. Я до сих пор не понимаю, почему мой вышеприведенный пример кода не удается :( – user1782011

 Смежные вопросы

  • Нет связанных вопросов^_^