Я пытаюсь запустить вложения слов , используя пакетное обучение , как показано ниже.
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)