2016-02-17 15 views
5

Tôi vừa mới bắt đầu chơi với TensorFlow và tôi đang cố gắng thực hiện một RNN rất đơn giản. RNN có x làm đầu vào, y làm đầu ra và chỉ bao gồm một lớp đơn lẻ có x và đầu ra trước đó là đầu vào. Dưới đây là một hình ảnh của các loại điều tôi có trong tâm trí:Làm thế nào để xây dựng một RNN đơn giản với một chu kỳ trong đồ thị trong TensorFlow?

A simple RNN

Vấn đề là, tôi không thể nhìn thấy bất cứ cách nào qua TensorFlow API để xây dựng một đồ thị với một chu kỳ trong đó. Bất cứ khi nào tôi xác định một Tensor tôi phải xác định những gì nó là đầu vào, có nghĩa là tôi đã có đã được xác định đầu vào của nó. Vì vậy, có một vấn đề gà và trứng.

Tôi thậm chí không biết nếu muốn xác định biểu đồ bằng một chu kỳ (Điều gì được tính trước? Tôi có phải định nghĩa giá trị ban đầu của nút softmax không?). Tôi đã chơi với ý tưởng sử dụng một biến để biểu diễn đầu ra trước đó và sau đó tự lấy giá trị y và lưu nó trong biến mỗi lần sau khi cho ăn thông qua một mẫu đào tạo. Nhưng điều đó sẽ rất chậm trừ khi có cách để thể hiện quy trình này trong chính đồ thị (?).

Tôi biết hướng dẫn của TensorFlow hiển thị các ví dụ về RNN nhưng chúng lừa và kéo một mô-đun LSTM ra khỏi thư viện đã có chu trình trong đó. Nhìn chung các hướng dẫn là tốt cho bước bạn thông qua làm thế nào để xây dựng những điều nhất định nhưng họ có thể làm một công việc tốt hơn để giải thích làm thế nào con thú này thực sự hoạt động.

Vì vậy, các chuyên gia của TensorFlow, có cách nào để xây dựng điều này không? Tôi sẽ làm thế nào?

+0

Ý tưởng biến của bạn có vẻ như một cách để đi, không nên chậm nếu bạn sử dụng biến TensorFlow/gán ops –

+0

Nhưng tôi sẽ không phải gọi 'sess.run (y_prev.assign (y))' và chạy các mẫu thông qua một tại một thời điểm? Hoặc bạn có nghĩa là tôi nên kết hợp điều này với chiến thuật unrolling được mô tả bởi @ Ishamael? – Shum

Trả lời

2

Như một vấn đề của thực tế, cả vượt qua phía trước và lạc hậu trong tất cả các khung học máy cho rằng mạng của bạn không có chu kỳ. Một cách phổ biến của việc thực hiện một mạng tái phát là mở nó trong thời gian cho một vài bước (nói 50), và do đó chuyển đổi một mạng có vòng lặp thành một mà không có bất kỳ.

Ví dụ, trong các tài liệu bạn đang đề cập đến:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

Họ đề cập đến

Để làm cho quá trình học tập dể làm, đó là một thực tế phổ biến để cắt ngắn gradient cho backpropagation đến một số cố định (num_steps) của các bước chưa được kiểm soát.

gì nó có hiệu quả có nghĩa là họ sẽ tạo ra các tế bào num_steps LSTM, trong đó mỗi mất như một đầu vào giá trị x cho timestep hiện tại, và đầu ra của module LSTM trước.

BasicLSTMCell rằng chúng sử dụng và bạn cho rằng có vòng lặp trên thực tế không có vòng lặp. Một ô LSTM chỉ thực hiện một bước LSTM (một khối có hai đầu vào [đầu vào và bộ nhớ] và hai đầu ra [đầu ra và bộ nhớ], và sử dụng cổng để tính kết quả đầu ra từ đầu vào), không phải toàn bộ mạng LSTM.

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