WandB를 이용해서 ROC, PR curves와 Confusion Matrices등 다양한 시각화 방법을 알아 보겠습니다.

image-20211017235128747 Open In Colab

개요

안녕하세요!! 이번 글에서는 WandB에서 모델 예측을 시각화하고 대시보드에 표시 할 수 있는 방법에 대해서 알아볼 예정이예요.

우리는 앞서 WandB이란?의 글에서 머신러닝의 학습을 도와주는 tool에 대해서 다뤄봤어요. 이 중에서 모델 학습을 시각화 하기 위해서 대시보드라는 기능을 다뤄봤네요. 오늘은 학습을 시각화 하는 방식을 좀 더 깊게 알아볼 예정입니다.

다양한 시각화 방법


image-20211018002140616
출처: wandb.ai

대표적으로 wandb에서는 학습 log 시각화를 주로 사용해요. 이번 포스터에는 wandb에서 사용할 수 있는 대시보드 종류들에 대해서 알아볼 예정입니다. 더 많은 시각화 방법이 있지만, 저희는 다음 몇개만 알아볼게요.

  • loss, accuracy 그래프
  • model parameter & gradients 그래프
  • predict된 이미지 시각화
  • sweep 그래프
  • confusion matrix(혼동 행렬)
  • precision(정밀도), recall (재현도) 그래프
  • ROC curve (Receiver Operating Characteristic curve)

loss, accuracy 그래프

  • 코드

    wandb.log({"train_loss": avg_loss}, step=epoch)  
    wandb.log({
            "val_acc": 100. * correct / len(loader.dataset),
            "val_loss": val_loss})
    
  • 시각화

    image-20211103140931686

loss와 acc는 학습을 할 때 필수적으로 시각화를 해야되는 그래프입니다. 위의 그림에서 train_loss는 epoch 단위 별로 성능 지표를 볼 수 있습니다. 그리고 sweep별로 그래프가 다른 색으로 구분되어 있어서 구분하기에 용이합니다.

val_loss와 val_acc는 가로 막대 그래프로 구성되어 있습니다. 이는 epoch 별로 다 기록한 것이 아니라, 한번의 vaildation을 통해 나온 값을 기록했기 때문입니다. 막대그래프로 표현이 되어 있어서 한눈에 파악하기 좋습니다.

model parameter & gradients 그래프

  • 코드

      wandb.watch(model, criterion, log="all", log_freq=10)
    
  • 시각화

    image-20211103140307694

대시보드를 사용해서 gradients와 prarmeter를 볼 수 있습니다. 모델이 학습이 잘 되고 있는 지 파악하기 좋습니다. log=”all”을 주면 gradient와 parameter를 다 기록 할 수 있습니다.

predict된 이미지 시각화

  • 코드

    example_images.append(wandb.Image(
                    data[0], caption="Pred: {} Truth: {}".format(pred[0].item(), target[0])))
      
     wandb.log({"Image": example_images})
                     
    
  • 시각화

    image-20211103145100414

CNN으로 학습을 돌릴 경우 predict된 결과와 target의 이미지를 볼 수 있습니다. 만일 predict 결과가 이상하다면 왜 그렇게 판단했는지 유추해 볼 수도 있을 것입니다. 또한 GAN의 경우 index 바를 조절해서 학습이 어떻게 진행되는 지 경과를 볼 수 있을 것입니다.

sweep 그래프

  • 코드
      sweep_id = wandb.sweep(sweep_config, project="project_name", entity='wandb_id')
      wandb.agent(sweep_id, run_sweeep, count=6)
    
  • 시각화

    image-20211103140337772

Sweep은 이미 봤던 그래프 입니다. 위쪽에는 변경할 파라미터의 이름이 나열되어 있고 세로축으로는 값이 나와있습니다. 우측 맨 끝에는 성능 측정 값이 적혀있습니다.

분류 성능 평가지표 시각화


confusion matrix, precision, recall, ROC curve는 주로 분류 문제에서 주로 사용되는 metric입니다. 의료 영상을 분류할 때도 자주 사용되는 평가 지표입니다. 다음 3가지 방법에 대한 시각화 코드도 알고 있다면 유용하게 사용될 것입니다.

ROC curve

  • 코드

      wandb.log({'roc': wandb.plots.ROC(y_test, y_prob_pred, cnb.classes_)})
    
  • 시각화

    출처: wandb.ai

ROC 그래프 또한 시각화 할 수 있습니다. TP와 FP를 한눈에 파악할 수 있습니다.

Confusion matrix

  • 코드

      wandb.sklearn.plot_confusion_matrix(y_test, y_pred, labels=classes_name)
    
  • 시각화

    image-20211019090855433

confusion_matrix를 사용하면 TP, FP, TN, FN을 모두 파악할 수 있습니다. 하지만 위의 그래프는 sweep을 실행하면 겹친다는 단점이 있습니다. 따라서 sweep을 사용하려면 아래와 같은 코드로 변경해야 됩니다.

  • 코드

      wandb.log({
          "Confusion Matrix" :wandb.plot.confusion_matrix(preds=best_all_preds,\
                              y_true=best_all_labels, class_names=classes_name)})
    
  • 시각화

    image-20211103141849146

색 별로 sweep을 구분할 수 있기 때문에 용이합니다.

Precision-Recall

  • 코드

      wandb.log({'pr': wandb.plots.precision_recall(y_test, y_prob_pred, cnb.classes_)})
    
  • 시각화

    image-20211103143737031

X축은 Precision, Y축은 Recall로 나타낼 수 있습니다. 상단에 위치할 수록 좋은 그래프라고 판단할 수 있습니다.

결론


이번 포스터에서는 대시보드에 표시 할 수 있는 방법을 깊게 알아보았습니다. 위의 방법 이외에도 custom 하게 그래프를 구현할 수 있는 방법들이 존재합니다. wandb를 사용하다보면 분석에 용이한 그래프 찾는 과정도 중요합니다. 이번 글이 wandb를 사용하는데 도움이 됐으면 좋겠습니다.