Я переглядав цей приклад мовної моделі LSTM на github (посилання) . Що це взагалі робить, мені цілком зрозуміло. Але я все ще намагаюся зрозуміти, що contiguous()робить виклик , який кілька разів трапляється в коді.
Наприклад, у рядку 74/75 коду створюються вхідні та цільові послідовності LSTM. Дані (що зберігаються ids) є двовимірними, де перший вимір - це розмір партії.
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())
Отже, як простий приклад, коли використовуються партії розмірів 1 і seq_length10 inputsі targetsвиглядає так:
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]
Тож загалом моє запитання: що робить contiguous()і навіщо мені це потрібно?
Далі я не розумію, чому метод викликається для цільової послідовності, а не вхідної послідовності, оскільки обидві змінні складаються з одних і тих самих даних.
Як може targetsбути суміжним і inputsвсе одно бути суміжним?
РЕДАГУВАТИ:
Я намагався не враховувати дзвінки contiguous(), але це призводить до повідомлення про помилку при обчисленні втрати.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Отже, очевидно, що виклик contiguous()у цьому прикладі необхідний.
(Для збереження цієї читабельності я уникав розміщення тут повного коду, його можна знайти за допомогою посилання GitHub вище).
Спасибі заздалегідь!

tldr; to the point summaryкороткий зміст.