loss = criterion(logits, labels) loss.backward() optimizer.step() batch_size = (labels != -1).long().sum().item() total_loss += batch_size * loss.item() total_samples += batch_size preds_collection.append(preds) labels_collection.append(labels) # if i % 100 == 0: # print('[epoch %d] [step %d] [loss %.4f]' % (epoch, i, loss.item())) preds_collection = torch.cat(preds_collection, dim=0) labels_collection = torch.cat(labels_collection, dim=0) mask = labels_collection != -1 preds_collection = preds_collection.masked_select(mask).cpu().numpy() labels_collection = labels_collection.masked_select(mask).cpu().numpy() train_precision = precision_score(y_true=labels_collection, y_pred=preds_collection, labels=[0, 1], average='macro') train_recall = recall_score(y_true=labels_collection, y_pred=preds_collection, labels=[0, 1], average='macro') train_f1 = f1_score(y_true=labels_collection, y_pred=preds_collection, labels=[0, 1], average='macro') train_loss = total_loss / total_samples print('epoch: %d\ttrain\tloss: %.4f\tprecision: %.4f\trecall: %.4f\tf1: %.4f' % (epoch, train_loss, train_precision, train_recall, train_f1)) val_loss, val_precision, val_recall, val_f1 = eval(tagger, val_loader, criterion) print('epoch: %d\tval\tloss: %.4f\tprecision: %.4f\trecall: %.4f\tf1: %.4f\n' % (epoch, val_loss, val_precision, val_recall, val_f1)) visualizer.add(epoch, train_loss, train_precision, train_recall, train_f1, val_loss, val_precision, val_recall, val_f1) if val_f1 > max_val_f1_score: max_val_f1_score = val_f1 torch.save(tagger, save_path) print('save model') print('max val f1_score: %.4f' % max_val_f1_score) visualizer.plot()