수달이네 기술 블로그

0. 파이토치 프레임워크(딥러닝 입문) 본문

AI공부/딥러닝

0. 파이토치 프레임워크(딥러닝 입문)

슬픈 수달이 2026. 1. 13. 20:16

파이토치

파이썬 기반의 오픈소스 딥러닝 프레임워크.

  • AI모델을 직관적으로 만들고 학습하도록 도와줌
  • 동적계산 그래프 방식 사용.
    • 코드 실행 시점에 실시간으로 계산 흐름이 결정되어 디버깅, 수정이 쉬움
  • GPU가속, 미분기능
    • 대규모 모델도 빠르게 학습

다른 프레임워크로는 텐서플로우가 있는데, 해당 프레임워크는 문법이 일반 개발 문법과 다른 특이한 문법이었기에 파이토치의 등장으로 요즘엔 편하게 사용한다.

  • 그러나 텐서플로우도 배워두는것이 좋으므로, 시간날때 공부해보기

동적 계산 그래프 방식

딥러닝 모델이 학습, 예측을 수행할 때 계산 그래프를 실행 시점에 실시간으로 생성, 수정한다.

  • 즉, 지금까지 나온 연산이 어떤 과정을 거치고, 이렇게 나오게 되었는지 기억.(이로인해 역추론 가능)
  • 조건문, 반복문 등 복잡한 논리구조에서 유연함
  • 디버깅에 용이, 연구 및 개발속도 빠름, 직관적 코드 작성
  • 계산그래프
    • 입력데이터를 바탕으로 연산을 수행해 그래프 생성.
    • 역전파를 통해 미분 계산 최종적으로 가중치 업데이트.

텐서(Tensor)

딥러닝 모델에서 데이터를 다룰때 사용되는 기본 데이터 구조.

  • 다차원 배열
    • Numpy와 비슷하나 GPU연산을 수행할 수 있다는 특징을 가짐
  • 자동미분기능(Autograd)등을 제공해 딥러닝 모델의 학습을 도움

스칼라(Scalar)

단 하나의 숫자를 담는 정수형(파이토치에선 스칼라를 0차원 텐서로 표현. 즉, 텐서의 차원이 전혀 없는 상태)

tensor자료형

  • 문자를 넣지 못하는 숫자를 넣는 자료형
import torch

var1 = torch.tensor(5)
print(var1)       # tensor(5)
print(var1.shape) # torch.Size([])

  • 위처럼 tensor자료형에 숫자 하나만 넣은 tensor자료형은 0차원 텐서로 표기된다.(스칼라)
var2 = torch.tensor([10])
print(var2)         # tensor([10])
print(var2.shape)   # torch.Size([1])

  • 그러나 array를 넣어주면. 그 안에 숫자 하나만 들어있더라도 1차원 tensor가 된다. (스칼라 X)
var3 = torch.tensor(3)
result = var1 + var3
print(result)          # tensor(8)
print(result.item())   # 8
  • 스칼라는 스칼라끼리 연산이 가능하다.
    • 출력이 tensor(8)로 되어있는 해당 값은 숫자로 사용하지 못한다 사용하려면 item()을 사용해야한다.

벡터(Vector)

하나 이상의 원소가 일렬로 나열된 1차원텐서(1D Tensor)를 의미한다.

var1 = torch.tensor([1, 2, 3])
print(var1)         # tensor([1, 2, 3])
print(var1.shape)   # torch.Size([3])

1차원 텐서를 의미한다

  • torch.Size([n])에서 n은 원소의 개수를 의미
var2 = var1 + 10
print(var2)       # tensor([11, 12, 13])
var3 = var1 * 2
print(var3)       # tensor([2, 4, 6])
  • 벡터 연산에서 스칼라를 더해주면 각 원소에 더해지고 곱해진다.
var4  = torch.tensor([1,2,3])
result = var1 + var4 
result      # tensor([2, 4, 6])
  • 벡터끼리의 합도 마찬가지
var4  = torch.tensor([1,2,3])
result = var1 @ var4 
result      # tensor(14)
  • @로 내적을 구해줄 수 있다.

행렬(Matrix)

2차원 형태의 텐서로 파이토치에선 shape가 (m,n)처럼 2개의 차원을 가진 텐서를 의미

var1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
var2 = torch.tensor([[10, 20, 30], [40, 50, 60]])
print(var1)     # tensor([[1, 2, 3],
                #         [4, 5, 6]])
print(var1.shape)  # torch.Size([2, 3])
  • 2차원 배열로 이루어진 것을 알 수 있다.
  • torch.Size([n,m])에서 n은 행 개수를 m은 열 개수를 의미한다.
print(var1 + var2)  # tensor([[11, 22, 33],
                    #         [44, 55, 66]])
print(var1 * var2)  # tensor([[ 10,  40,  90],
                    #         [160, 250, 360]])
  • 위와 같이 행렬 합, 곱이 가능하다(곱의 경우 각 요소끼리 곱 행렬곱은 mm)
var3 = torch.tensor([[1,2],[2,4], [3,4,]])
print(torch.mm(var1, var3))     # tensor([[ 20,  40],
                                #         [ 56, 112]])
print(var1 @ var3)      # tensor([[ 20,  40],
                        #         [ 56, 112]])
  • torch.mm메서드로 행렬 곱 연산을 할 수 있다.
  • 연산자로는 @를 사용한다.(벡터의 내적)

다차원 텐서(Multi-dimensinal Tensor)

여러 축을 가지는 텐서를 의미(3차원 이상)

  • 이미지, 음성, 동영상, 시계열 데이터등의 데이터를 표현
  • 이미지 : 이미지 n*n *3(RGB)등등
var1 = torch.tensor([
    [[1, 2],[3, 4]],
    [[5, 6],[7, 8]]
])
var2 = torch.tensor([
    [[10, 20],[30, 40]],
    [[50, 60],[70, 80]]
])

print(var1)     # tensor([[[1, 2],
                #          [3, 4]],
                #
                #         [[5, 6],
                #          [7, 8]]])
print(var1.shape)  # torch.Size([2, 2, 2])
  • torch.Size([x,y,z]): x = y,z의 행렬이 2개, y = 행이 2개, z = 열이 2개

텐서의 활용

data = [
    [1,2],
    [3,4]
]
t1 = torch.tensor(data)
print(t1)   # tensor([[1, 2],
            #         [3, 4]])
  • 위와 같이 배열을 텐서로 만들어 줄 수 있다.
t1 = torch.tensor([5])
t2 = torch.tensor([10])
ndarr1 = (t1 + t2).numpy()
print(ndarr1)   # [15]
print(type(ndarr1)) # <class 'numpy.ndarray'>
  • 텐서형을 ndarray로 형태로 바꿔줄 수도 있다.
result = ndarr1 * 10
t3 = torch.from_numpy(result)
print(t3)  # tensor([150])
print(type(t3))  # <class 'torch.Tensor'>
  • ndarray를 tensor형으로 바꿔줄수도 있다.
  • 텐서의 인덱싱 방식은 다른 array와 같다.
t1 = torch.tensor([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
])

print(t1[0])        # tensor([1, 2, 3, 4])
print(t1[:, 0])     # tensor([1, 5, 9])
print(t1[:, -1])    # tensor([ 4,  8, 12])
print(t1[..., 2])   # tensor([ 3,  7, 11])