Giả sử bạn có dữ liệu chuỗi thời gian với hàng và 700 cột mà bạn muốn cung cấp cho một lớp trong Keras. Trước khi bạn cung cấp dữ liệu đó cho RNN, bạn cần định hình lại dữ liệu trước đó thành thang đo 3D. Vì vậy, nó trở thành một NN700SimpleRNN(200, return_sequence=True)
.N× 700 × 1
Hình ảnh được lấy từ https://colah.github.io/posts/2015-08-Under Hiểu-LSTMs
Trong RNN, các cột của bạn ("700 cột") là dấu thời gian của RNN. Dữ liệu của bạn được xử lý từ . Sau khi cung cấp dữ liệu cho RNN, bây giờ nó có 700 đầu ra là h 1 đến h 700 , không phải h 1 đến h 200t = 1 t o 700 h1h700h1h200 . Hãy nhớ rằng bây giờ hình dạng của dữ liệu của bạn là , đó làN× 700 × 200 các mẫu (các hàng) x dấu thời gian (các cột) x kênh .
Và sau đó, khi bạn áp dụng a TimeDistributedDense
, bạn đang áp dụng một Dense
lớp trên mỗi dấu thời gian, có nghĩa là bạn đang áp dụng một Dense
lớp trên mỗi , h 2 , ..., h t tương ứng. Điều đó có nghĩa là: thực sự bạn đang áp dụng thao tác được kết nối đầy đủ trên mỗi kênh của nó ("200" một) tương ứng, từ h 1 đến h 700 . " 1 × 1 × 200 " đầu tiên cho đến lần thứ 700 " 1 × 1 × 200h1h2hth1h7001 × 1 × 2001 × 1 × 200 ".
Tại sao chúng ta lại làm việc này? Bởi vì bạn không muốn làm phẳng đầu ra RNN.
Tại sao không làm phẳng đầu ra RNN? Bởi vì bạn muốn giữ riêng từng giá trị dấu thời gian.
Tại sao giữ cho mỗi giá trị dấu thời gian riêng biệt? Bởi vì:
- bạn chỉ muốn tương tác các giá trị giữa dấu thời gian của chính nó
- bạn không muốn có sự tương tác ngẫu nhiên giữa các dấu thời gian và kênh khác nhau.