Tôi đã xem qua ví dụ này về mô hình ngôn ngữ LSTM trên github (liên kết) . Những gì nó làm nói chung là khá rõ ràng đối với tôi. Nhưng tôi vẫn đang đấu tranh để hiểu những gì gọi contiguous()
thực hiện, điều này xảy ra nhiều lần trong mã.
Ví dụ trong dòng 74/75 của đầu vào mã và trình tự đích của LSTM được tạo. Dữ liệu (được lưu trữ trong ids
) là 2 chiều trong đó kích thước đầu tiên là kích thước lô.
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
Vì vậy, như một ví dụ đơn giản, khi sử dụng kích thước lô 1 và seq_length
10 inputs
và targets
trông giống như sau:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
Vì vậy, nói chung câu hỏi của tôi là, những gì có contiguous()
và tại sao tôi cần nó?
Hơn nữa, tôi không hiểu tại sao phương thức được gọi cho chuỗi đích chứ không phải chuỗi đầu vào vì cả hai biến đều bao gồm cùng một dữ liệu.
Làm thế nào có thể targets
được uncontiguous và inputs
vẫn được tiếp giáp?
CHỈNH SỬA:
Tôi đã cố gắng bỏ qua cuộc gọi contiguous()
, nhưng điều này dẫn đến thông báo lỗi khi tính toán mất mát.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Vì vậy, rõ ràng việc gọi contiguous()
trong ví dụ này là cần thiết.
(Để giữ cho mã này dễ đọc, tôi đã tránh đăng toàn bộ mã ở đây, có thể tìm thấy mã này bằng cách sử dụng liên kết GitHub ở trên.)
Cảm ơn trước!
tldr; to the point summary
câu ngắn gọn cho phần tóm tắt điểm.