Размеры функции потерь Pytorch не совпадают - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь запустить вложения слов , используя пакетное обучение , как показано ниже.

def forward(self, inputs):
    print(inputs.shape)
    embeds = self.embeddings(inputs)
    print(embeds.shape)
    out = self.linear1(embeds)
    print(out.shape)
    out = self.activation_function1(out)
    print(out.shape)
    out = self.linear2(out).cuda()
    print(out.shape)
    out = self.activation_function2(out)
    print(out.shape)
    return out.cuda()

Здесь я использую размер контекста 4, размер пакета 32, размер вложения 50, размер скрытого слоя 64, размер вокаба 9927

Вывод функций "shape"

печать (input.shape) ----> torch.Size ([4, 32])

print (embeds.shape) ----> torch.Size ([4, 32, 50])

print (out.shape) ----> torch.Size ([4, 32, 64])

print (out.shape) ----> torch.Size ([4, 32, 64])

print (out.shape) ----> torch.Size ([4, 32, 9927])

print (out.shape) ----> torch.Size ([4, 32, 9927])

Являются ли эти формы правильными? Я в замешательстве.

Также, когда я тренируюсь, возвращается ошибка:

def train(epoch):
  model.train()
  for batch_idx, (data, target) in enumerate(train_loader, 0):
    optimizer.zero_grad()
    output = model(torch.stack(data))
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()

Я получаю сообщение об ошибке в строке "потеря = критерий (выход, цель)". Там написано: «Ожидаемый ввод batch_size (4) будет соответствовать целевому batch_size (32)». Верны ли мои формы для функции «вперед»? Я не очень знаком с пакетным обучением. Как сделать так, чтобы размеры совпадали?

------- РЕДАКТИРОВАТЬ: размещение кода инициализации ниже -----

  def __init__(self, vocab_size, embedding_dim):
    super(CBOW, self).__init__()
    self.embeddings = nn.Embedding(vocab_size, embedding_dim)
    self.linear1 = nn.Linear(embedding_dim, 64)
    self.activation_function1 = nn.ReLU()
    self.linear2 = nn.Linear(64, vocab_size)
    self.activation_function2 = nn.LogSoftmax(dim = -1)

1 Ответ

0 голосов
/ 22 марта 2019
Для метода

torch.nn.Linear forward в качестве первого аргумента требуется размер пакета.

Вы предоставляете его как второе (сначала это временные шаги), используйте permute(1, 0, 2), чтобы сделать их первым.

Кроме того, линейные слои обычно принимают двумерный ввод, причем первым является пакетный режим, а вторым - размер ввода. У вас 3д из-за слов (я полагаю), может вы хотите использовать рекуррентные нейронные сети (например, torch.nn.LSTM)?

...