Поле набора данных PyTorch для последовательности векторов (без словарного запаса) - PullRequest
2 голосов
/ 06 марта 2020

У меня есть «простая» задача машинного перевода, где у меня есть последовательность векторов, которые нужно сопоставить слову или двум. (вектор 258 измерений)

Например:

  • [[1, ..., 2], [3, ..., 4]] => "привет"
  • [[1, ..., 2], [3, ..., 4], [5, ..., 6]] => "привет мир"

Для целевого поля я использую Field(eos_token="<eos>", is_target=True), который при пакетной обработке дает мне тензор с отступом, в этом случае:

tensor([
  [1, 1], # 1 is "hello"
  [2, 3], # 2 is "world", 3 is <eos>
  [3, 0], # 0 is <pad>
])

Однако src поле заполняется не так, как sequential, но не имеет словаря (Field(use_vocab=False)).

Когда я читаю src из BucketIterator в пакете размером> 1, я получаю:

Traceback (последний последний вызов):

Файл "train.py", строка 50, в поезде

for b, batch in enumerate(train_iter):

Файл "/torchtext/data/iterator.py", строка 156, в iter

yield Batch(minibatch, self.dataset, self.device)

Файл "/torchtext/data/batch.py", строка 34, в init

setattr(self, name, field.process(batch, device=device))

Файл "/torchtext/data/field.py", строка 237, в процессе

tensor = self.numericalize(padded, device=device)

Файл "/ torchtext / data / field .py ", строка 359, в числовом виде

var = torch.tensor(arr, dtype=self.dtype, device=device)

ValueError: ожидаемая последовательность длиной 258 при dim 2 (получено 5) * 10 50 *

То, что я хочу получить, это тензор:

tensor([
  [[1, ..., 2], [1, ..., 2]],
  [[3, ..., 4], [3, ..., 4]],
  [[5, ..., 6], [0, ..., 0]],
  [[0, ..., 0], [0, ..., 0]],
])

То, что я думаю Я мог бы иметь, но не знаю, как это подтвердить:

tensor([
  [[1, ..., 2], [1, ..., 2]],
  [[3, ..., 4], [3, ..., 4]],
  [[5, ..., 6], 0],
  [0, 0],
])
...