국문과 유목민

[일일리포트] Day 30 (Level1_PStage_4) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 30 (Level1_PStage_4)

논곰 2022. 3. 2. 23:49

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

wandb

 모델을 학습하면서 제일 어려웠던 부분이 바로 실험 결과를 관리하는 것이었다. 텐서보드를 사용했을 때 내 학습 결과를 보기에는 꽤 좋았지만 팀원들의 결과나 setting값을 알고 싶어도 별도로 DM을 보내거나 해야했기에 어려움이 있었다. 그래서 wandb를 사용하고자 생각했다.

 wandb의 경우 수업에서도 다뤘었고, 설정도 어렵지 않았기 때문에 수월하게 적용할 수 있었다. 다음 링크는 wandb를 학습하는데 참고한 사이트들이다. 

참고 링크1: https://greeksharifa.github.io/references/2020/06/10/wandb-usage/

참고 링크2: https://wandb.ai/quickstart/pytorch

 

Weights & Biases – Developer tools for ML

WandB is a central dashboard to keep track of your hyperparameters, system metrics, and predictions so you can compare models live, and share your findings.

wandb.ai

간단한 사용법 

  1. wandb 설치 pip install wandb
  2. wandb login을 진행한다.
wandb login
# 결과:
wandb: You can find your API key in your browser here: https://app.wandb.ai/authorize
wandb: Paste an API key from your profile and hit enter:

  3. https://wandb.ai/quickstart/pytorch를 따라한다.

처음에는 어려울 것 같다고 생각해서 걱정했었는데, 하려고 하니까 걱정한 시간보다 더 빨리 적용할 수 있었다. log 설정하는 경우와 config 설정하는 경우에서 살짝 헤맸었는데 log의 경우 tensorboard가 적용되어 있다면 그 형식과 같게 넣어주면 되고, config의 경우 초기에 wnadb.init(config=[값]) 처럼 넣어주면 쉽게 해결할 수 있는 문제였다. 참고로 wandb는 tensorboard와 다르게 별도로 epoch을 지정해주지 않아도 자기 스스로 step을 계산한다 (신가한지고...)

  DataGenerator

 멘토링을 통해 멘토님과 말을 나누던 중 문득 '데이터 Augmentation은 Transform의 느낌이 강하다면 진짜 데이터의 양을 절대적으로 늘려보면 어떨까?'라는 생각을 해봤다. Horizon Flip이나 Color Jitter를 활용한다면 Imbalance한 데이터를 Balance하게 만들어줄 수 있을 것이라고 생각했다. 그래서 아래 코드는 이미지에 Transform을 줘서 별도로 저장한 코드이다. 

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns 
from PIL import Image 
import os
from torchvision import transforms
data_dir = os.listdir("../input/data")
# Train Dataset 경로
train_dir = '경로 지정'

# meta 데이터와 이미지 경로를 불러옵니다. (테스트 데이터의 )
train_df = pd.read_csv(os.path.join(train_dir, 'train.csv'))
image_dir = os.path.join(train_dir, 'images')

image_paths = [os.path.join(image_dir, img_path) for img_path in train_df.path]

def transform(img, idx):
    if idx == 0:
        torchvision_transform = transforms.Compose([
        transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.1, hue=0.1)])
    elif idx == 1:
        torchvision_transform = transforms.Compose([transforms.RandomHorizontalFlip(p = 1)])
    else:
        torchvision_transform = transforms.Compose([
        transforms.ColorJitter(brightness=0.1, contrast=0.1, saturation=0.2, hue=0.2)])
    return torchvision_transform(img)

target_ls = ["normal.jpg", "incorrect_mask.jpg"]
for path in image_paths:
    picture_list = os.listdir(path)
    picture_list = [fname for fname in picture_list if fname[0] != "."] # 임시파일 제외
    for j in picture_list:
        if j in target_ls:
            target_img_path = os.path.join(path, j)
            img = Image.open(target_img_path).convert("RGB") # 이미지 불러오기
            for k in range(3):
                img = transform(img, k)
                tag = j.split('.')[0]
                img.save(f'{path}/{tag}{k}.jpg')

 해당 데이터가 유의미한 차이점을 주는 지는 아직 테스트를 해보지 못해서 확실하게 얘기할 수는 없을 것 같다. 내일까지 모델을 돌리고 결과를 적어두도록 해야겠다. 

▶ Review

 오늘은 팀원들의 실험 관리를 위해 Wnadb를 구현하고, Data Generator를 만들어봤다. 또 Resnet을 가지고 어제 하던 실험을 이어가기도 했다. 그리고 피어세션 때 팀원들이 만들어둔 코드를 다 합하고, 멘토링을 한 이후에는 모델을 좀 돌려봤다. 이번에는 좀 여러가지가 추가가 됐다.

 우선 cutmix가 구현이 되었고, ImbalanceDatasetSampler라는 게 구현이 되었다. 또한 원래 부족한 데이터였던 no_mask와 incorrect_mask의 데이터를 transform해서 늘려줬다. 오전까지는 크게 의미있는 결과가 나오지 않았었지만, 저녁에 여러가지 기법들을 접목해서 densenet을 돌리니까 loss가 굉장히 낮게 나오는 것을 확인할 수 있었다. Training loss는 높은데 Validation loss는 0.006점대까지 가면서 처음에는 좋다가 어...뭔가 이상한데 싶은 생각이 들었다. 제출해보지는 않았지만 아쉽게도 우선, 분포는 썩 좋게 나오지는 않았다.  하지만 이제는 너무 많은 것을 추가해서 일단은 성능을 끌어올리는데 집중을 해야겠다.

오늘 하루 정리

혼세마왕 당신이 옳았어

 

Comments