Я просматривал этот пример языковой модели 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
краткое резюме.