Эффективная оценка метрик в PyTorch - PullRequest
0 голосов
/ 18 июня 2019

Я новичок в PyTorch и хочу эффективно оценить F1 среди других во время моего обучения и моего цикла валидации.

До сих пор мой подход заключался в том, чтобы вычислить прогнозы на GPU, затем передать их в CPU и добавитьих в вектор для обучения и проверки.После Обучения и Валидации я оценил бы обе эпохи, используя sklearn.Однако, профилируя мой код, он показал, что загрузка в процессор является узким местом.

for epoch in range(n_epochs):
    model.train()
    avg_loss = 0
    avg_val_loss = 0
    train_pred = np.array([])
    val_pred = np.array([])
    # Training loop (transpose X_batch to fit pretrained (features, samples) style)
    for X_batch, y_batch in train_loader:
        scores = model(X_batch)
        y_pred = F.softmax(scores, dim=1)
        train_pred = np.append(train_pred, self.get_vector(y_pred.detach().cpu().numpy()))

        loss = loss_fn(scores, self.get_vector(y_batch))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        avg_loss += loss.item() / len(train_loader)

    model.eval()
    # Validation loop
    for X_batch, y_batch in val_loader:
        with torch.no_grad():
            scores = model(X_batch)
            y_pred = F.softmax(scores, dim=1)
            val_pred = np.append(val_pred, self.get_vector(y_pred.detach().cpu().numpy()))
            loss = loss_fn(scores, self.get_vector(y_batch))
            avg_val_loss += loss.item() / len(val_loader)

    # Model Checkpoint for best validation f1
    val_f1 = self.calculate_metrics(train_targets[val_index], val_pred, f1_only=True)
    if val_f1 > best_val_f1:
        prev_best_val_f1 = best_val_f1
        best_val_f1 = val_f1
        torch.save(model.state_dict(), self.PATHS['xlm'])
        evaluated_epoch = epoch

    # Calc the metrics
    self.save_metrics(train_targets[train_index], train_pred, avg_loss, 'train')
    self.save_metrics(train_targets[val_index], val_pred, avg_val_loss, 'val')

Я уверен, что есть более эффективный способ а) сохранять прогнозы без необходимости выдвигать их для обработки каждого пакета.б) рассчитать показатели на GPU напрямую?

Поскольку я новичок в PyTorch, я очень благодарен за любые советы и отзывы:)

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете вычислить F-счет самостоятельно в pytorch.Балл F1 определяется только для одноклассной (истинной / ложной) классификации.Единственное, что вам нужно, - это агрегировать число:

  • Количество классов в целевых данных наземной истинности;
  • Количество классов в предсказаниях;
  • Подсчитайте, сколько раз класс был правильно спрогнозирован.

Предположим, вы хотите вычислить оценку F1 для класса с индексом 0 в вашем softmax.В каждой партии вы можете выполнить:

predicted_classes = torch.argmax(y_pred, dim=1) == 0
target_classes = self.get_vector(y_batch)
target_true += torch.sum(target_classes == 0).float()
predicted_true += torch.sum(predicted_classes).float()
correct_true += torch.sum(
    predicted_classes == target_classes * predicted_classes == 0).float()

Когда все партии обработаны:

recall = correct_true / target_true
precision = correct_true / predicted_true
f1_score = 2 * precission * recall / (precision + recall)

Не забудьте позаботиться о случаях, когда точность и отзыв равны нулю, а когдажелаемый класс вообще не был предсказан.

...