14

Tôi đang cố gắng hiểu các mô hình seq2seq được xác định trong seq2seq.py trong tensorflow. Tôi sử dụng bit mã tôi sao chép từ ví dụ translate.py đi kèm với tensorflow. Tôi tiếp tục nhận được cùng một lỗi và thực sự không hiểu nó đến từ đâu.Lỗi khi xây dựng mô hình seq2seq với tensorflow

Một ví dụ mã tối thiểu để sao chép các lỗi:

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)) 

Các lỗi tôi nhận được khi đánh giá dòng cuối cùng (tôi đánh giá nó tương tác trong dịch viên 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]] 

Tôi nghi ngờ lỗi đến từ phía tôi :) Trên một sidenote. Các tài liệu hướng dẫn và các hướng dẫn thực sự tuyệt vời nhưng mã ví dụ cho trình tự để mô hình trình tự (ví dụ dịch tiếng Anh sang tiếng Pháp) là khá dày đặc. Bạn cũng phải nhảy rất nhiều giữa các tập tin để hiểu những gì đang xảy ra. Tôi ít nhất đã bị mất nhiều lần trong mã.

Một ví dụ tối thiểu (có lẽ trên một số dữ liệu đồ chơi) về xây dựng và đào tạo mô hình seq2seq cơ bản sẽ thực sự hữu ích ở đây. Ai đó biết nếu điều này đã tồn tại ở đâu đó?

EDIT Tôi đã sửa mã ở trên theo gợi ý @Ishamael (nghĩa là không trả về lỗi) (xem bên dưới), nhưng vẫn còn một số điều không rõ ràng trong phiên bản cố định này. Đầu vào của tôi là một chuỗi các vectơ có chiều dài 2 giá trị thực có giá trị. Và đầu ra của tôi là một chuỗi các vectơ nhị phân có độ dài 22. Mã nguồn tf.placeholder của tôi có trông giống như sau không? (EDIT có)

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

Tôi cũng đã phải thay đổi tf.int32 để tf.float32 trên. Vì đầu ra của tôi là nhị phân. Nếu điều này không phải là tf.int32 cho tf.placeholder của bộ giải mã của tôi thì sao? Nhưng tensorflow lại phàn nàn nếu tôi làm điều này. Tôi không chắc lý do đằng sau chuyện này là gì.

Kích thước lớp ẩn của tôi là 512 tại đây.

mã cố định hoàn chỉnh

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

Tôi đang cố gắng tìm hiểu seq2seq trong tf ngay bây giờ. Là 350 kích thước vocab của bộ mã hóa của bạn và 45 kích thước vocab của bộ giải mã của bạn? – Soubriquet

Trả lời

8

Hầu hết các mô hình (seq2seq không phải là một ngoại lệ) mong đợi đầu vào của họ được theo lô, vì vậy nếu hình dạng của đầu vào logic của bạn là [n], sau đó một hình dạng của một tensor bạn sẽ được sử dụng như một đầu vào đối với mô hình của bạn phải là [batch_size x n]. Trong thực tế, kích thước đầu tiên của hình dạng thường bị loại bỏ là None và được suy ra là kích thước lô khi chạy.

Vì đầu vào logic vào seq2seq là một vectơ các số, nên hình dạng tensor thực tế phải là [None, input_sequence_length].Vì vậy, mã cố định sẽ nhìn dọc theo dòng:

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))) 

(và sau đó là tương tự cho các bộ giải mã)

+0

cảm ơn vì đã giúp tôi! Tôi đã chỉnh sửa câu hỏi của tôi ở trên theo đề xuất của bạn và thêm một số câu hỏi bổ sung. 512 là kích thước của lớp ẩn của tôi. trong tf.placeholder nên phản ánh kích thước của vector đầu vào và đầu ra của tôi và không phải là kích thước của lớp ẩn? – user1782011

+0

Có, tôi nghi ngờ nó không được 512, nhưng thông báo lỗi nhầm lẫn tôi :) Tôi đoán tôi hiểu sai nó. Cách bạn sửa mã của bạn thực tế là đúng. Tôi không chắc chắn về vấn đề 'int32' vs' float', nhưng lưu ý rằng 'basic_rnn_seq2seq' có đối số' dtype' mặc định là 'float32'. Hãy thử đặt nó thành 'int32' và sau đó thay đổi đầu vào của bạn thành' int32' - nhưng tôi không hiểu đầy đủ về tham số đó, do đó, nó chỉ là một phỏng đoán. – Ishamael

+0

Ngoài ra, thường là một cách hay để đặt câu hỏi mới khi bạn gặp phải các vấn đề mới, trái ngược với việc chỉnh sửa câu hỏi, để câu trả lời và câu hỏi được giữ đơn giản và bao gồm một vấn đề duy nhất khi mọi người tìm kiếm chúng. – Ishamael

1

Có một phương pháp tự kiểm tra trong dịch mô-đun cho thấy việc sử dụng tối thiểu của nó. [here]

Tôi vừa chạy phương pháp tự kiểm tra bằng cách sử dụng.

python translate.py --self_test 1 
+0

Hey, tự kiểm tra thực sự hữu ích; Nhưng điểm đau chính của tôi là ở seq2seq_model.py. Tôi vẫn không hiểu tại sao ví dụ mã trên của tôi bị lỗi: ( – user1782011

Các vấn đề liên quan