2017-08-22 17 views
9

Hình dạng của p_input trong this LSTM Autoencoder cho "test.py" là (128,8,1); có nghĩa là 128 bộ gồm 8 chữ số. Tôi đang cố gắng để thích ứng với mô hình này với dữ liệu dựa trên chuỗi thời gian với 4 bộ 25.000 bước thời gian (về cơ bản là 0 giây đến 25.000 giây). Tôi đã cố gắng nhập tập dữ liệu này vào p_input với hình dạng (4,25000,1) và không xảy ra lỗi. Tuy nhiên khi tôi chạy kịch bản, thay vì nhận được iter 1: 0.01727, iter 2: 0.00983, ... Tôi không nhận được bất kỳ phản hồi nào được in từ tập lệnh vì vậy tôi giả định có điều gì đó đang giữ tập lệnh. Tôi cũng đã cố gắng chỉ thay đổi batch_num thành 4 và step_num thành 25.000 trực tiếp vào tệp "test.py" chưa được chỉnh sửa và kết quả tương tự của không có phản hồi in nào xảy ra.LSTM Autoencoder không tiến bộ khi tập lệnh đang chạy trên tập dữ liệu lớn hơn

Suy nghĩ của tôi là trong "test.py", p_inputs mất quá nhiều thời gian để tính toán các hoạt động tf.splittf.squeeze. Một suy nghĩ khác là tôi có thể cần phải tăng số lượng đơn vị LSTM ẩn trong số hidden_num và/hoặc tăng số lượng kỷ nguyên (iteration). Ngoài ra, có thể là batch_num phải lớn hơn step_num. Tôi đã thử điều này với "test.py" với step_num = 4batch_num = 25000 và tập lệnh chạy bình thường với phản hồi được in.

Hãy cho tôi biết suy nghĩ của bạn về vấn đề có thể xảy ra khi giữ tập lệnh chạy.

Trả lời

4

Thứ nguyên thứ hai của đầu vào của bạn là số lần mạng bị vô hiệu hóa cho các độ dốc của máy tính theo thuật toán BPTT.

Ý tưởng là mạng lặp lại (như LSTM) được chuyển đổi thành mạng feedforward bằng cách "bỏ chọn" mỗi bước thời gian làm lớp mới của mạng.

Khi bạn cung cấp toàn bộ chuỗi thời gian cùng nhau (nghĩa là 25000 bước thời gian), bạn sẽ hủy mạng của mình 25000 lần, tức là bạn sẽ nhận được mạng nguồn cấp dữ liệu chưa được kiểm soát với 25000 lớp !!

Vì vậy, mặc dù tôi không biết tại sao bạn không nhận được bất kỳ lỗi nào, vấn đề có thể liên quan đến vấn đề OUT OF MEMORY. Bạn không thể phù hợp với 25000 lớp 'biến vào bộ nhớ.

Khi bạn phải xử lý chuỗi thời gian dài, bạn cần chia dữ liệu của mình thành nhiều phần (cho phép nói 20 bước thời gian). Bạn cung cấp một đoạn duy nhất cho mỗi lần chạy. Sau đó, tại mỗi lần chạy sau, bạn cần khôi phục trạng thái ban đầu của mạng với trạng thái cuối cùng của lần chạy trước đó.

Tôi có thể cung cấp cho bạn một ví dụ. Những gì bạn có bây giờ (tôi bỏ qua chiều thứ ba vì những lý do thực tế) là một 4x25000 vector được định hình một cái gì đó như thế này:

--------------------- 25000---------------------- 
| 
| 
4 
| 
| 
-------------------------------------------------- 

Bây giờ bạn phải chia nó thành những phần như thế này:

----20----- ----20----- ----20----- 
|   | |   | |   | 
|   | |   | |   | 
4   | 4   | 4   | [...] 
|   | |   | |   | 
|   | |   | |   | 
----------- ----------- ----------- 

Bạn cung cấp một chunck duy nhất 4x20 mỗi lần. Sau đó, trạng thái cuối cùng của LSTM của bạn sau mỗi chuck, phải được cung cấp như đầu vào với chuck tiếp theo.

Vì vậy, bạn feed_dict phải một cái gì đó như thế này:

feed_dict ={x: input_4_20}, 
      state.c = previous_state.c, 
      state.h=previous_state.h} 

Xem LM tutorial của Tensorflow cho một ví dụ về cách cung cấp trạng thái của một LSTM để chạy tới.

Tensorflow cung cấp một số chức năng để thực hiện việc này một cách tự động. Kiểm tra Tensorflow DevSummit Tutorial trên RNN API để biết thêm. Tôi liên kết chính xác thứ hai, nơi các chức năng mong muốn được giải thích. Chức năng là tf.contrib.training.batch_sequences_with_states(...)

Là lời khuyên cuối cùng, tôi khuyên bạn nên suy nghĩ lại về nhiệm vụ của mình. Thực tế, một chuỗi thời gian 25000 là một chuỗi dài thực sự và tôi lo lắng về việc thậm chí một LSTM thậm chí không thể quản lý những phụ thuộc quá khứ như vậy. Ý tôi là khi bạn xử lý phần tử 24000 của loạt bài, trạng thái LSTM có lẽ đã quên mọi thứ về phần tử thứ nhất. Trong những trường hợp này, hãy thử xem dữ liệu của bạn để xem đó là thang đo của hiện tượng của bạn. Nếu bạn không cần độ chi tiết của một giây (tức là chuỗi video của bạn có nhiều dự phòng vì các tính năng không thay đổi nhanh chóng theo thời gian), hãy giảm bớt chuỗi video của bạn để có chuỗi ngắn hơn để quản lý.

+0

Cảm ơn bạn đã phản hồi. 25.000 bước thời gian đến từ nội suy và lựa chọn số điểm. Tôi luôn có thể thay đổi nó. Số bước tối đa sẽ là bao nhiêu? Ngoài ra tôi không hoàn toàn hiểu làm thế nào bạn làm chunking ngay cả sau khi đọc tất cả các liên kết của bạn. –

+0

Tôi đã chỉnh sửa câu trả lời. Cho tôi biết nếu nó rõ ràng hơn. Đối với những gì liên quan đến số bước thời gian tối đa, nó phụ thuộc vào nhu cầu của bạn. LSTM có khả năng học phụ thuộc khá xa trong quá khứ, nhưng theo kinh nghiệm của tôi, đi xa hơn 100 bước thời gian là không tốt. Vì vậy, như một đầu vào duy nhất, không vượt quá khối quá dài trong kích thước thời gian (giữ 20-50 là tốt hơn) –

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