I am trying to develop a skip-gram model of word2vec with the help of pytorch however, while training I am facing the above error. Please guide me what I am doing wrong. Here is my model:
class Skipgram(torch.nn.Module):
def init(self,vocab_size,embedding_dimensions,window_size):
super().init()
self.embeddings = nn.Embedding(vocab_size, embedding_dimensions)
self.linear1 = nn.Linear(embedding_dimensions, 128)
self.activation_1 = nn.ReLU()
self.linear2 = nn.Linear(128, window_size*vocab_size)
self.activation_2 = nn.LogSoftmax(dim=-1)
def forward(self, inputs):
embeds = self.embeddings(inputs)
embeds_1 = sum(embeds).view(1,-1)
out = self.linear1(embeds_1)
out = self.activation_1(out)
out = self.linear2(out)
out = self.activation_2(out)
return out
def get_context_embedddings(self,target):
target = [word_to_num[w] for w in target]
return self.embeddings(target).view(1,-1)
model = Skipgram(vocab_size,embedding_dim,window_size)
Here is the training code:
for epochs in range(50):
total_loss = 0for center_word, target in data_1: center_vector = torch.tensor([word_to_num[center_word]], dtype=torch.long) y_val = model(center_vector) idxs = torch.tensor([word_to_num[w] for w in target],dtype=torch.long) total_loss+= criterion(y_val,idxs) #Updating gradients and parameters optimizer.zero_grad() total_loss.backward() optimizer.step()
Here is the error that I am facing:
ValueError Traceback (most recent call last)
in
6 y_val = model(center_vector)
7 idxs = torch.tensor([word_to_num[w] for w in target],dtype=torch.long)
----> 8 total_loss+= criterion(y_val,idxs)
9
10~\Anaconda3\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
→ 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),~\Anaconda3\lib\site-packages\torch\nn\modules\loss.py in forward(self, input, target)
1046 assert self.weight is None or isinstance(self.weight, Tensor)
1047 return F.cross_entropy(input, target, weight=self.weight,
→ 1048 ignore_index=self.ignore_index, reduction=self.reduction)
1049
1050~\Anaconda3\lib\site-packages\torch\nn\functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, reduction)
2691 if size_average is not None or reduce is not None:
2692 reduction = _Reduction.legacy_get_string(size_average, reduce)
→ 2693 return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
2694
2695~\Anaconda3\lib\site-packages\torch\nn\functional.py in nll_loss(input, target, weight, size_average, ignore_index, reduce, reduction)
2383 if input.size(0) != target.size(0):
2384 raise ValueError(
→ 2385 “Expected input batch_size ({}) to match target batch_size ({}).”.format(input.size(0), target.size(0))
2386 )
2387 if dim == 2:ValueError: Expected input batch_size (1) to match target batch_size (4).
Please tell me what I am doing wrong here. I would be grateful for your help.