Я просматривал этот пример языковой модели 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
оставаться непрерывным?
EDIT:
Я пытался пропустить вызов contiguous()
, но это приводит к сообщению об ошибке при вычислении потери.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Итак, очевидно, что вызов contiguous()
в этом примере необходим.
(Для сохранения читабельности я не стал публиковать здесь полный код, его можно найти по ссылке выше на GitHub.)
Заранее спасибо!