본문 바로가기

개발 공부/Deep Learning 기본

[Deep Learning] 01 - Deep Learning, PyTorch 기초 [작성 중]

더보기

AI Computer Vision 과목을 배우는 동안 정신이 없어, 공부한 걸 정리할 엄두를 못 냈다. 과목이 끝났으니 시간을 내서 하나씩 정리해보려고 한다.

0. Deep Learning

  • AI(Artificial Intelligence, 인공지능) : 사람처럼 생각하는 모든 기술
    • ex : 체스를 두는 AI, 자동 번역기, 챗봇 등
  • ML(Machine Learning, 기계학습) : 데이터로부터 스스로 학습하는 AI
    • ex : 스팸 메일 필터, 고객 분류 AI
  • DL(Deep Learning, 딥러닝) : 인간의 뇌처럼 여러 층으로 학습하는 ML
    • 인간의 신경망을 모사하여, 여러 층으로 쌓은 레이어를 통과해 결과를 예측/분류함
    • 사실상, 활성 함수, 배치 정규와, Drop Out등의 기법을 중간에 섞은, 텐서 곱이다.
    • ex : MLP (Multilayer Perceptron)

AI, ML, DL의 포함 관계

더보기

 어떤 의미에선, 믿음의 영역같이 느껴지기도 한다. '모든 데이터는 특정한 다차원 공간에서 영역으로 표현할 수 있다.'는 직관을 받아들이면, 무엇이 되었든 그러한 데이터들을 잘 분류할 수 있게 데이터를 모으고 모델의 레이어를 쌓으면 결과를 예측, 분류하는 AI가 어떻게 행렬(텐서)들과 1차 연산만으로 만들어질 수 있는지 이해할 수 있게 된다. 물론, 수학자들과 통계학자, 물리학자들이 그 직관 이상의 논리를 통해, 단순한 MLP의 한계를 극복하고 더 뛰어난 AI를 만들기 위한 각종 기법(당장 활성화 함수 ReLU의 사용으로 MLP를 만든 것부터 그렇다)들을 고안해왔고, 지금도 연구 각종 연구 결과가 쏟아지고 있다.

1. PyTorch

  • Python으로 딥러닝 모델을 만들고 학습시키는 데 사용하는 라이브러리
  • 이전에 TensorFlow로 딥러닝을 했으나 2017년 PyTorch가 등장한 이후 Python과 PyTorch의 편의성과 직관성, 연구 코드가 쌓이게 되면서 딥러닝의 주류가 됨

1 - 1. Tensor

  • 벡터 공간 및 그 쌍대 공간들을 일종의 '곱연산'을 사용해 복합적으로 연결시킨 구조
    • 수학적 엄밀함보단 딥러닝에서 사용을 기준으로 나누면 아래와 같다.
    • 텐서 자체는 numpy로도 만들 수 있지만, 계산 그래프를 연결하고 딥러닝의 주요 연산(Forward Propagation, Back Propagation, Optimizer.step() 등)을 수행하려면 torch.Tensor로 변환해야 한다.
차원 수   형태 .shape 예
0 스칼라 (Scalar) [a]  (1, ) np.zeros(1)
1 벡터 (Vector) [a b c d]  (n, ) np.zeros(5)
2 행렬 (Array) [[a b c d],
 [e f  g h],
 [    ...    ]]
(n, m) np.zeros((4, 3))

3 이상 텐서 (Tensor) [[[a b c d],
  [e f  g h],
  [    ...    ]],
 [[    ...    ],
       ...
  [    ...    ]]] 
(n, m, l, ...) torch.Tensor(np.zeros((4, 3, 5)))

 

1 - 2. Dataset / DataLoader

  • PyTorch에서 데이터(예 : 라벨(정답)-이미지)를 담는 컨테이너 클래스
  • torch.utils.data의 Dataset 클래스, DataLoader 클래스를 사용
  • Dataset : 데이터 하나를 반환하는 방법
  • DataLoader : 데이터를 배치 단위로 묶어 모델에 전달하는 방법, 배치 사이즈 조절, 훈련 데이터 Shuffle, 메모리 pinning 등의 기능을 지원
    • 사용법을 요약하면, 데이터들을 처음부터 Dataset 타입으로 로드하거나 Dataset으로 변환
      => Dataset에 적용할 Transforms를 정의 (예 : 텐서 변환, 정규화, 각종 데이터 증강) 
      => DataLoader에 Dataset를 탑재
      => 모델을 학습시키거나 모델을 사용해 예측을 할 때 data, labels in dataLoader와 같은 튜플 언패킹 방식으로 받아 모델에 전달
    • # 훈련용 Transform 정의
      train_transform = transforms.Compose([
          transforms.RandomHorizontalFlip(p=0.5),
          transforms.Resize(224),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(0.5, 0.5),
          transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
      ])
      
      # 검증용 Transform 정의
      test_transform = transforms.Compose([
          transforms.Resize(224),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(0.5, 0.5)
      ])
      
      # ImageFolder 라이브러리를 사용해 train_dir, test_dir에 있는 데이터를 DataSets로 로드
      train_data = datasets.ImageFolder(train_dir, transform=train_transform)
      test_data = datasets.ImageFolder(test_dir, transform=test_transform)
      
      # Datasets를 DataLoader에 탑재
      # 훈련용 데이터만 shuffle => 매 반복마다 배치에 포함되는 데이터의 구성을 랜덤으로 바꿔줌
      # => 모델이 데이터의 순서까지 외워 과적합 하는 것을 방지함
      train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
      test_loader = DataLoader(test_data, batch_size=64, shuffle=False)
  • 각종 라이브러리, git 저장소 등에서 데이터를 다운받아 사용 가능
    • # 학습용 이미지 다운로드
      w = !wget https://github.com/makaishi2/pythonlibs/raw/main/images/dog_wolf.zip
      # !wget: colab 환경에서 리눅스의 wget 명령어를 실행하여 파일 다운로드
      
      # 학습용 이미지 압축풀기
      w = !unzip dog_wolf.zip
      # 디렉토리명 설정
      data_dir = 'dog_wolf'
      
      # 학습, 테스트 디렉토리명 설정
      import os
      train_dir = os.path.join(data_dir, 'train')
      test_dir = os.path.join(data_dir, 'test')
      
      # 분류 클래스 설정
      classes = ['dog', 'wolf']
      
      # 훈련용 데이터 트랜스폼
      train_transform = transforms.Compose([
          transforms.RandomHorizontalFlip(p=0.5),
          transforms.Resize(224),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(0.5, 0.5),
          transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
      ])
      
      # 테스트용 데이터 트랜스폼 (증강 X)
      test_transform = transforms.Compose([
          transforms.Resize(224),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(0.5, 0.5)
      ])
      
      train_data = datasets.ImageFolder(train_dir, transform=train_transform)
      test_data = datasets.ImageFolder(test_dir, transform=test_transform)
      
      train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
      test_loader = DataLoader(test_data, batch_size=64, shuffle=False)
  • 참고 : 사용된 개/늑대 데이터 셋

1 - 3. 모델 정의

  • 파라미터(Weight + Bias)를 학습시킬 모델 정의
  • torchvision의 models에서 이미 만들어진 모델을 다운받아 사용 가능
from torchvision import models
net = models.vgg19_bn(pretrained = True) # pretrained : 사전에 학습된 파라미터 적용