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 = 0
for 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.