Размеры функции потери Pytorch не совпадают

#python #neural-network #pytorch

#python #нейронная сеть #pytorch

Вопрос:

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

 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» являются

печать (входные данные.форма) —-> torch.Size([4, 32])

печать (вставки.shape) —-> torch.Size([4, 32, 50])

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

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

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

печать (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()
  

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

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

   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:

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

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

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