Я переглядав цей приклад мовної моделі 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_length
10 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
короткий зміст.