Hi, I am doing a text classification using pytorch and BERTSequenceClassification. The model will classify the text into 5 classes but I got this error while doing the training.
ValueError: Target size (torch.Size([16])) must be the same as input size (torch.Size([16, 5]))
Below is my code:
class BERT(nn.Module):
def __init__(self):
super(BERT, self).__init__()
options_name = "bert-base-uncased"
self.encoder = BertForSequenceClassification.from_pretrained(options_name, problem_type="multi_label_classification", num_labels=5)
def forward(self, OriginalTweet, label):
loss, text_fea = self.encoder(OriginalTweet, labels=label)[:2]
return loss, text_fea
model = BERT().to(device)
optimizer = optim.Adam(model.parameters(), lr=2e-5)
criterion = nn.CrossEntropyLoss()
num_epochs = 5
eval_every = len(train_loader) // 2
file_path = destination_folder
best_valid_loss = float("Inf")
# initialize running values
running_loss = 0.0
valid_running_loss = 0.0
global_step = 0
train_loss_list = []
valid_loss_list = []
global_steps_list = []
# training loop
model.train()
for epoch in range(num_epochs):
for (labels, OriginalTweet), _ in train_loader:
labels = labels.type(torch.LongTensor)
labels = labels.to(device)
OriginalTweet = OriginalTweet.type(torch.LongTensor)
OriginalTweet = OriginalTweet.to(device)
output = model(OriginalTweet, labels)
loss, _ = output
optimizer.zero_grad()
loss.backward()
optimizer.step()
# update running values
running_loss += loss.item()
global_step += 1
# evaluation step
if global_step % eval_every == 0:
model.eval()
with torch.no_grad():
# validation loop
for (labels,OriginalTweet), _ in valid_loader:
labels = labels.type(torch.LongTensor)
labels = labels.to(device)
OriginalTweet = OriginalTweet.type(torch.LongTensor)
OriginalTweet = OriginalTweet.to(device)
output = model(OriginalTweet, labels)
loss, _ = output
valid_running_loss += loss.item()
# evaluation
average_train_loss = running_loss / eval_every
average_valid_loss = valid_running_loss / len(valid_loader)
train_loss_list.append(average_train_loss)
valid_loss_list.append(average_valid_loss)
global_steps_list.append(global_step)
# resetting running values
running_loss = 0.0
valid_running_loss = 0.0
model.train()
# print progress
print('Epoch [{}/{}], Step [{}/{}], Train Loss: {:.4f}, Valid Loss: {:.4f}'
.format(epoch+1, num_epochs, global_step, num_epochs*len(train_loader),
average_train_loss, average_valid_loss))
# checkpoint
if best_valid_loss > average_valid_loss:
best_valid_loss = average_valid_loss
save_checkpoint(file_path + '/' + 'model.pt', model, best_valid_loss)
save_metrics(file_path + '/' + 'metrics.pt', train_loss_list, valid_loss_list, global_steps_list)
save_metrics(file_path + '/' + 'metrics.pt', train_loss_list, valid_loss_list, global_steps_list)
I am very new in this field and I have been stuck in this error for a while. So any help is appreciated! Thank you