Home [BoostCamp AI Tech / PyTorch] Day6 - Introduction to PyTorch and Basics
Post
Cancel

[BoostCamp AI Tech / PyTorch] Day6 - Introduction to PyTorch and Basics

PyTorch : Introduction to PyTorch ans Basics


딥 러닝 프레임워크

1. Tensorflow

  • 딥러닝 프레임워크의 선두주자’였’던 TensorFlow다.
  • ‘였’던 이라는건 지금은 아마 PyTorch로 넘어간 걸로 알고있다.
  • TF의 아버지는 구글이다보니 초기부터 굉장한 밀어주기가 있어서 지금도 많은 소스들이 존재한다.
  • 실제로 2020년에도 점유율은 35.1%정도를 차지하고 있다.
  • 이런 텐서플로우를 보좌해주는 친구가 존재하는데 그게 바로 Keras다.
    • 텐서플로우에 코드를 하나하나 다 적는거보다는 layer나 optimizer같은 것들을 쉽게 조작할 수 있게 도와주는 역할을 케라스가 한다.
  • 소스자체도 많고 관련 오픈소스들이 많다보니 실제 서비스 구축에서 많이 사용된다.
  • Define and Run
    • Tensorflow의 model graph 형성방법은 static graph이다.
      즉 모델을 우선 구성하고 학습을 진행하는 것이다.
  • 텐서플로우는 production, cloud, multip GPU에서 강점을 보인다.

2. PyTorch

  • 딥러닝 프레임워크계의 신흥강자인 파이토치이다.
  • 파이토치의 아버지도 텐서플로우 못지 않게 빠방한데, 바로 페이스북이다.
  • 텐서플로우와 다르게 내부 코드를 하나하나 동작하면서 학습을 돌릴 수 있기 때문에 연구목적으로 많이 사용된다.
  • Define by Run (Dynamic Computational Graph, DCG)
    • PyTorch는 텐서플로우와 다르게 실행을 하면서 모델 그래프를 그린다.
    • 이런 방식은 디버깅의 편의성을 가져오기 때문에 연구 목적으로 쓰기 가장 훌륭하다.

PyTorch

1
import torch

1. Numpy

  • PyTorch에는 Numpy의 ndarray와 유사한 역할을 하는 Tensor가 존재한다.
  • Tensor를 생성하는 방식도 Numpy와 동일하다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      import torch
      import numpy as np
    
      # numpy array
      n_array = np.arange(10).reshape(2, 5)
    
      # tensor
      t_array = torch.FloatTensor(n_array)
    
      # array to tensor
      data = [[3, 5], [10, 5]]
      x_data = torch.tensor(data)
    
      # ndarray to tensor
      nd_array_ex = np.array(data)
      tensor_array = torch.from_numpy(nd_array_ex)
    
  • GPU tensor라는 특수한 자료형이 존재한다.
    • 이는 GPU환경 즉, cuda에서 돌리기 위한 특수 자료형이다.
  • 기본적인 numpy의 연산이 대부분 활용된다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      data = [[3, 5, 20], [10, 5, 50], [1, 5, 10]]
      x_data = torch.tensor(data)
    
      x_data.flatten()
      # tensor([ 3,  5, 20, 10,  5, 50,  1,  5, 10])
    
      torch.ones_like(x_data)
      # tensor([[1, 1, 1],
      #         [1, 1, 1],
      #         [1, 1, 1]])
    
      x_data.shape
      # torch.Size([3, 3])
    
      x_data.dtype
      # torch.int64
    
  • pytorch는 GPU에 올려서 사용이 가능하다.
    1
    2
    3
    4
    
      if torch.cuda.is_available():
          x_data_cuda = x_data.to('cuda')
      else:
          x_data_cuda = x_data.to('cpu')
    
  • Tensor를 다루는 방법도 numpy와 유사한데 주의해야할 것이 있다.
    • view
      • tensor에는 reshapeview가 모두 존재하는데 둘의 역할은 둘다 차원을 변환해주는 것은 같다.
        하지만 약간의 차이가 존재하는데 reshape는 메모리의 구조와 간련이 있어 reshape 동작과 함께 copy가 발생하지만 view는 copy가 아닌 기존의 데이터를 그대로 사용한다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        
          import torch
        
          a = torch.zeros(3, 2)
          b = a.view(2, 3)
          a.fill_(1)
        
          print(b)
          # tensor([[1., 1., 1.],
          #         [1., 1., 1.]])
        
          a = torch.zeros(3, 2)
          b = a.t().reshape(6)
          a.fill_(1)
        
          print(b) # tensor([0., 0., 0., 0., 0., 0.])
        
    • squeeze, unsqueezq
      • squeeze는 tensor의 차원을 한단계 낮추는 함수이다.
      • unsqueeze는 반대로 tensor의 차원을 axis에 맞춰 높여주는 역할을 한다.
      1
      2
      3
      4
      5
      6
      7
      
        import torch
      
        tensor_ex = torch.rand(size=(2, 1, 2))
        tensor_ex.squeeze() 
        # tensor([[0.5461, 0.9128],
        #         [0.4809, 0.8499]])
      
      
    • torch.mm, torch.matmul
      • pytorch에도 행렬연산이 가능하다. 이때 행렬곱은 torch.mm을 사용하는 것을 권장한다.
      • torch.dot은 벡터의 내적 연산만을 진행하고 행렬 연산은 지원하지 않는다.
      • torch.matmul도 행렬곱으로 동작하지만 이는 broadcasting이 발생하기 때문에 계산결과의 이해가 어렵다.
      • torch.mm은 broadcasting을 진행하지 않으므로 충분히 이해가되는 계산 연산이 이뤄진다.

2. AutoGrad

  • ML/DL formula
    • nn.functional 모듈을 활용하여 다양한 수식 변환을 지원한다.
    • 간단한 예로는 softmax와 one_hot encoding이 있다.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
        import torch
        import torch.nn.functional as F
      
        tensor = torch.FloatTensor([0.5, 0.7, 0.1])
        h_tensor = F.softmax(tensor, dim=0)
      
        y = torch.randint(5, (7, 5))
        y_label = y.argmax(dim=1)
      
        torch.nn.functional.one_hot(y_label)
        """
        tensor([[1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0],
                [0, 0, 0, 0, 1],
                [0, 0, 1, 0, 0],
                [1, 0, 0, 0, 0],
                [0, 1, 0, 0, 0],
                [1, 0, 0, 0, 0]])
        """
      
  • AutoGrad
    • PyTorch의 핵심은 자동민부을 지원한다. 이를 통해 backward 함수에 사용된다.
      1
      2
      3
      4
      5
      6
      
        w = torch.tensor(2.0, requires_grad=True) # 미분 대상에는 require_grad=True 설정
        y = w**3
        z = 12 * y + 2
        z.backward()
        w.grad
        # tensor(144.)
      
    • AutoGrad는 편미분도 가능하다.
This post is licensed under CC BY 4.0 by the author.

[Programmers] 카카오 블라인드 2022 - k진수에서 소수 개수 구하기

[BoostCamp AI Tech / PyTorch] Day6 - PyTorch 프로젝트 구조 이해하기

Comments powered by Disqus.