Hi, I’m very new to NNs and Pytorch and I’m getting the following error for a multiclass text classification task using LSTM.
I have 10 classes in my dataset. This code has originally been for binary classification and I’m changing it. When I changed the criterion to nn.CrossEntropyLoss() this issue happened. preds and targets shape is printed in the code.
ERROR:
Traceback (most recent call last):
  File "/Users/nimashahbazi/PycharmProjects/reddit/RNN/embedding_layer.py", line 59, in <module>
    train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
  File "/Users/nimashahbazi/PycharmProjects/reddit/RNN/train.py", line 26, in train
    acc = accuracy(predictions, batch.label)
  File "/Users/nimashahbazi/PycharmProjects/reddit/RNN/accuracy.py", line 8, in accuracy
    correct = (rounded_preds == y).float()
  File "/Users/nimashahbazi/PycharmProjects/reddit/env/lib/python3.7/site-packages/torch/tensor.py", line 28, in wrapped
    return f(*args, **kwargs)
RuntimeError: The size of tensor a (10) must match the size of tensor b (64) at non-singleton dimension 1

Process finished with exit code 1

TEXT = data.Field(tokenize='spacy', batch_first=True, include_lengths=True)
LABEL = data.LabelField(dtype=torch.long, batch_first=True)
training_data = data.TabularDataset(path='/Users/nimashahbazi/PycharmProjects/reddit/data/scraper/train/train.csv', format='csv', skip_header=True,
                                    fields=[('label', LABEL), ('text', TEXT)])
train_data, valid_data = training_data.split(split_ratio=0.9, random_state=random.seed(SEED))
TEXT.build_vocab(train_data, min_freq=3, vectors="glove.840B.300d")
LABEL.build_vocab(train_data)
BATCH_SIZE = 64
train_iterator, valid_iterator = data.BucketIterator.splits(
    (train_data, valid_data),
    batch_size=BATCH_SIZE,
    sort_key=lambda x: len(x.text),
    sort_within_batch=True,
    device='cpu')

size_of_vocab = len(TEXT.vocab)
embedding_dim = 300
num_hidden_nodes = 128
num_output_nodes = 10
num_layers = 2
bidirection = True
dropout = 0.2

def train(model, iterator, optimizer, criterion):
    # initialize every epoch
    epoch_loss = 0
    epoch_acc = 0

    # set the model in training phase
    model.train()

    for batch in iterator:
        # resets the gradients after every batch
        optimizer.zero_grad()

        # retrieve text and no. of words
        text, text_lengths = batch.text

        # convert to 1D tensor
        predictions = model(text, text_lengths).squeeze()

        # compute the loss
        loss = criterion(predictions, batch.label)

        # compute the binary accuracy
        acc = accuracy(predictions, batch.label)

        # backpropage the loss and compute the gradients
        loss.backward()

        # update the weights
        optimizer.step()

        # loss and accuracy
        epoch_loss += loss.item()
        epoch_acc += acc.item()

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

def accuracy(preds, y):
    rounded_preds = torch.round(preds)
    print(rounded_preds.shape)   // torch.Size([64, 10])
    print(y.shape)                          //torch.Size([64])
    correct = (rounded_preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

Can anyone help me with the problem??