[DL] PyTorch 기초 - ① 텐서

    PyTorch란?

    facebook(현 meta)에서 개발한 파이썬 기반의 오픈소스 딥러닝 프레임워크다.

    딥러닝 모델을 손쉽게 만들고 학습시킬 수 있도록 도와주는 도구로, 최근에는 많은 연구자와 개발자들이 딥러닝 연구 및 서비스 개발에 널리 사용하고 있다. 

     

    그렇다면 왜 PyTorch를 쓸까?

    딥러닝은 수학적으로 복잡한 계산이 많이 필요한 분야다.

    하지만 우리가 매번 수식을 직접 미분하고, 계산하고, 업데이트할 수는 없다.

    이런 과정을 대신 처리해주는 것이 바로 딥러닝 프레임워크의 역할이다.

     

    PyTorch는 그 중에서도 직관적인 코드 구성, 강력한 디버깅 기능, 동적 그래프라는 특징으로 연구자들과 개발자들에게 큰 인기를 얻고 있다.

     

    PyTorch의 주요 특징

    PyTorch는 다음과 같은 특징들을 가지고 있다.

    • 실행 시점에 계산 그래프를 생성하는 동적 방식을 사용해 조건문이나 반복문을 자유롭게 사용할 수 있으며, 디버깅도 용이하다.
    • 자동 미분(Autograd)복잡한 수식을 일일이 미분할 필요가 없기 때문에, 딥러닝 모델 학습에 매우 유용하다.
    • 텐서의 연산 과정을 추적하고 .backward() 한 줄로 자동으로 미분을 계산할 수 있다.
    • 텐서(Tensor) 중심 구조다만 GPU 연산이 가능해 대규모 행렬 연산에도 효율적이다.
    • 파이토치의 기본 데이터 구조는 텐서이며, 이는 NumPy 배열과 유사하다.
    • GPU 가속 지원이를 통해 학습 속도를 크게 높일 수 있다.
    • .cuda() 또는 .to("cuda")를 통해 손쉽게 연산을 GPU로 전환할 수 있다.
    • 직관적인 코드 구성
    • Python 문법과 매우 유사해 초보자도 빠르게 익힐 수 있으며, 가독성 또한 높다.

    PyTorch에서 대부분의 연산은 텐서를 중심으로 이루어진다.

    이때 텐서가 어떤 장치(device) 위에 위치하느냐에 따라 연산 속도나 가능 여부가 달라진다.

     

    PyTorch는 CPU와 GPU(CUDA)를 모두 지원하며, 텐서를 생성하거나 연산하기 전 사용 가능한 디바이스를 확인하고 지정하는 것이 일반적이다. 또한 Apple의 M1/M2 칩에서는 "mps", TPU 환경에서는 "xla" 디바이스도 지원된다.

     

    아래 코드는 사용 가능한 GPU가 있다면 "cuda"를, 그렇지 않으면 "cpu"를 사용하도록 설정하는 예시다.

    import torch
    import os
    
    # GPU 지정 (예: 0번 GPU 사용)
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print(f"사용 중인 장치: {device}")

     

    텐서(Tensor)란?

    PyTorch에서 데이터를 표현할 때 가장 기본이 되는 구조는 Tensor(텐서)이다.

    텐서는 수학에서의 행렬(matrix) 개념을 일반화한 것으로, 스칼라(0차원), 벡터(1차원), 행렬(2차원)은 물론, 그 이상의 다차원 배열까지 표현할 수 있다.

     

    Python에서 자주 사용하는 NumPy의 배열과 거의 비슷하지만, PyTorch의 텐서는 GPU 연산이 가능하다는 점에서 차이가 있다. 머신러닝에서는 이미지, 텍스트, 음성 등 다양한 데이터들이 텐서로 변환되어 모델에 입력되며, 모델의 파라미터도 텐서로 표현된다. PyTorch에서는 이러한 텐서를 효율적으로 연산하기 위해, 텐서의 크기(shape)디바이스 일치 여부를 항상 확인하는 것이 중요하다.

     

    아래 코드는 텐서를 생성하는 기초적인 예시다. 가장 기본적인 방법은 리스트나 배열로부터 직접 생성하는 것이며, 그 외에도 다른 텐서의 형태를 따라 생성하거나, 랜덤/상수 값으로 초기화할 수 있다.

    import torch
    import numpy as np
    
    # 텐서 생성
    data = [[1, 2],[3, 4]]
    x_data = torch.tensor(data)
    print(f"텐서 생성: {x_data}")
    
    # NumPy 배열로부터 텐서 생성
    np_array = np.array(data)
    x_np = torch.from_numpy(np_array)
    print(f"NumPy에서 텐서 생성: {x_np}")
    
    # 다른 텐서로부터 텐서 생성
    x_ones = torch.ones_like(x_data)
    print(f"ones_like: {x_ones}")
    
    x_rand = torch.rand_like(x_data, dtype=torch.float)
    print(f"rand_like: {x_rand}")
    
    # 랜덤 또는 상수 값을 갖는 텐서 생성
    shape = (2, 3)
    rand_tensor = torch.rand(shape)
    ones_tensor = torch.ones(shape)
    zeros_tensor = torch.zeros(shape)
    
    print(f"랜덤 텐서: {rand_tensor}")
    print(f"1로 채워진 텐서: {ones_tensor}")
    print(f"0으로 채워진 텐서: {zeros_tensor}")

     

     

    'AI > DL' 카테고리의 다른 글

    [DL] 퍼셉트론  (0) 2024.01.28
    [DL] 딥러닝의 학습 방법  (1) 2023.12.26

    댓글