[딥러닝, 인공지능] - P1_Ch4 : 파이토치(PyTorch) (1)

2025. 12. 28. 15:39·ML & AI
반응형

PyTorch

1. 파이토치 개요

PyTorch란 무엇인가?

 

2015년에 설립된 FAIR(페이스북 인공지능 연구소)에 의해 주로 개발되어 왔다. 2016년 9월에 처음으로 공개되었다. 페이스북에서는 PyTorch와 Caffe2를 둘다 사용하고 있었는데, 두 가지 프레임워크를 사용하다보니 호환성 문제가 발생해서 결국 2017년 9월에 마이크로소프트와 협업하여 2018년 3월에 Caffe2를 PyTorch에 합쳐버렸다.

 

TensorFlow와 마찬가지로 NumPy의 배열을 Tensor로 가져올 수 있고, 이를 쉽게 GPU 메모리에 올려 연산이 가능하다. TensorFlow가 v2.0 출시 이후 친 keras 행보를 보이며 자유로운 네트워크 수정의 난이도가 점점 높아지자, 연구원들 사이에서는 PyTorch의 사용 비중이 높아져 지금은 인공지능 학계에서 널리 사랑받는 라이브러리로 자리매김하였다.

 

PyTorch는 각 버전마다 여러 CUDA 버전을 지원하며, 설치하고 실행하는 방법은 조금 까다로운 경향이 있다.

우분투에서 설치하여 실행하는 방법에 대해서는 따로 아래를 참고하면 좋을 것 같다.

 

URL : (첨부할 것)

 

2. 파이토치 사용법에 관하여

1) GPU 사용 여부 체크하기

data = [
  [1, 2],
  [3, 4]
]

x = torch.tensor(data)
print(x.is_cuda)

x = x.cuda() # GPU로 옮기기
print(x.is_cuda)

x = x.cpu() # CPU로 옮기기
print(x.is_cuda)

<결과>
False
True
False

이런식으로 Tensor를 GPU에 올리는 것을 확인하고 시작을 한다. 사실 환경설정 작업에서 아마 위에 글을 참고해서 설치를 할 경우

제대로 버전과 맞게 설치를 한 경우

이러한 확인이 된 상태에 가능한 것이고 어렵다면 Google Colab을 통하여 런타임 변경으로 GPU가 가능하게 하여 실험을 해보는 것도 나쁘지 않다. 이때 주의할 점은 서로 다른 장치(device)에 있는 텐서끼리 연산을 수행하면 오류가 발생한다.

 

2) 텐서 소개 및 생성 방법

  • PyTorch에서의 텐서(tensor)는 기능적으로 넘파이(NumPy)와 매우 유사하다.
  • 기본적으로 다차원 배열을 처리하기에 적합한 자료구조로 이해할 수 있다.
  • PyTorch의 텐서는 "자동 미분" 기능을 제공한다.

a. 텐서의 속성으로는 모양(shape), 자료형(data type), 저장된 장치 이렇게 3가지가 존재한다.

tensor = torch.rand(3, 4)

print(tensor)
print(f"Shape: {tensor.shape}")
print(f"Data type: {tensor.dtype}")
print(f"Device: {tensor.device}")

---<결과>----
tensor([[0.0382, 0.1886, 0.6329, 0.6845],
        [0.6452, 0.0139, 0.9579, 0.0769],
        [0.1706, 0.6858, 0.7632, 0.9365]])
Shape: torch.Size([3, 4])
Data type: torch.float32
Device: cpu

 이런식으로 확인이 가능하다. 

tensor_cuda = tensor.cuda()
print(f"Device: {tensor_cuda.device}")

---<결과>---
Device: cuda:0

이런식으로 디바이스를 변경하여 GPU로 텐서를 옮기는 것도 가능하다. 

 

b. 텐서 초기화

  • 리스트 데이터에서 직접 텐서를 초기화 가능하다.
    • data = [[1,2],[3,4]] -> x = torch.tensor(data) 하면 초기화 가능하다.
  • Numpy 배열에서 텐서를 초기화 가능하다.
    • a = torch.tensor([5]) , b = torch.tensor([7]) -> c = (a + b).numpy() 이렇게 한 상태에서 torch.from_numpy(data) 하면 배열에서 텐서로 변환되면서 동시에 초기화를 넘파이 배열에서 초기화 한 것이 된다.
  • 다른 텐서로부터 텐서 초기화 가능하다.
    • torch.ones_like(data), torch.zeros_like(data)

3) 텐서의 형변환 및 차원 조작

 

텐서의 특정 차원 접근하기

- 대신 이때 dim=n을 사용할 경우 순서가 만약에 3x4라면 3행 4열인데 dim=0이라면 행을 기준으로 행 vs 행끼리 비교해야 한다는 것이므로 1행의 1열이면 2행의 1열 이렇게 비교하라는 소리와 같다. 이게 헷갈리는 용어 표현으로 잘 기억해야 한다.

dim에서 각 숫자의 의미가 어려울 때 shape를 통해 (2,3,4)라고 나올 경우 각 dim=0,1,2 순서라고 생각하면서 무엇을 의미하는지 시각적으로 파악하면서 확인해보면 어렵지 않음.

 

 

텐서 형변환

a = torch.tensor([2], dtype=torch.int)
b = torch.tensor([5.0])

print(a.dtype)
print(b.dtype)

# 텐서 a는 자동으로 float32형으로 형변환 처리
print(a + b)
# 텐서 b를 int32형으로 형변환하여 덧셈 수행
print(a + b.type(torch.int32))

---<결과>---
torch.int32
torch.float32
tensor([7.])
tensor([7], dtype=torch.int32)

 

텐서의 모양 변경

  • view()는 텐서의 모양을 변경할 때 사용하고 데이터의 원본은 그대로 둔 채 바라보는 모양(shape)만 바꾼다.
  • 이때, 텐서(tensor)의 순서는 변경되지 않는다.
  • 새로운 메모리 공간을 할당하여 복사하는 것이 아니라 기존 a가 점유하고 있는 메모리 주소를 b가 그대로 가리킨다.
# view()는 텐서의 모양을 변경할 때 사용한다.
# 이때, 텐서(tensor)의 순서는 변경되지 않는다.
a = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8])
b = a.view(4, 2)
print(b)

# a의 값을 변경하면 b도 변경
a[0] = 7
print(b)

# a의 값을 복사(copy)한 뒤에 변경
c = a.clone().view(4, 2)
a[0] = 9
print(c)

---<결과>---
tensor([[1, 2],
        [3, 4],
        [5, 6],
        [7, 8]])
tensor([[7, 2],
        [3, 4],
        [5, 6],
        [7, 8]])
tensor([[7, 2],
        [3, 4],
        [5, 6],
        [7, 8]])

 

텐서의 차원 교환

  • 하나의 텐서에서 특정한 차원끼리 순서를 교체할 수 있다.
a = torch.rand((64, 32, 3))
print(a.shape)

b = a.permute(2, 1, 0) # 차원 자체를 교환
# (2번째 축, 1번째 축, 0번째 축)의 형태가 되도록 한다.
print(b.shape)

---<결과>---
torch.Size([64, 32, 3])
torch.Size([3, 32, 64])

 

4) 텐서의 차원 줄이기 혹은 늘리기

  • unsqueeze() 함수는 크기가 1인 차원을 추가한다.
    • 배치(batch) 차원을 추가하기 위한 목적으로 흔히 사용된다.
  • squeeze() 함수는 크기가 1인 차원을 제거한다.

이걸 하는 이유는 딥러닝 모델의 학습을 위해서 가능하게 만들기 위해서 차원을 변경하는 것이 필수적이기 때문이다.

  • 규격 맞춤: 딥러닝 모델은 입력 데이터의 차원(보통 4차원: Batch, C, H, W)이 엄격히 정해져 있다. 데이터가 한 개라도 '배치 차원'을 추가해야 연산이 가능하다.
  • 브로드캐스팅 방지: 차원이 맞지 않으면 파이토치가 임의로 데이터를 확장해 계산하는 오류가 발생할 수 있다. 이를 방지하기 위해 차원을 명확히 맞춘다.
  • 학습 영향: 데이터 값 자체를 바꾸지는 않지만, 모델이 행렬 연산을 수행할 수 있는 '형식'을 갖추게 한다.

5) 자동 미분과 기울기(Gradient) <requires_grad=True>

import torch

# requires_grad를 설정할 때만 기울기 추적 -> 각각의 변수가 연산이 수행될 때 기울기를 추적 가능하다.
x= torch.tensor([3.0,4.0], requires_grad = True)
y= torch.tensor([1.0,2.0], requires_grad = True)
z = x+y

print(z) # [4.0, 6.0]
print(z.grad_fn) # 더하기(add)

out = z.mean()
print(out) # 5.0
print(out.grad_fn) # 평균(mean)

out.backward() # scalar에 대하여 가능
print(x.grad)
print(y.grad)
print(z.grad) # leaf variable에 대해서만 gradient 추적이 가능하다. 따라서 None.


---<결과>---
tensor([4., 6.], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x78bafc388bb0>
tensor(5., grad_fn=<MeanBackward0>)
<MeanBackward0 object at 0x78bafc388bb0>
tensor([0.5000, 0.5000])
tensor([0.5000, 0.5000])
None
/tmp/ipython-input-54259782.py:18: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the .grad field to be populated for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more information. (Triggered internally at /pytorch/build/aten/src/ATen/core/TensorBody.h:489.)
  print(z.grad) # leaf variable에 대해서만 gradient 추적이 가능하다. 따라서 None.
  • 일반적으로 모델을 학습할 때는 기울기(gradient)를 추적한다.
  • 하지만, 학습된 모델을 사용할 때는 파라미터를 업데이트하지 않으므로, 기울기를 추적하지 않는 것이 일반적이다.
temp = torch.tensor([3.0, 4.0], requires_grad=True)
print(temp.requires_grad)
print((temp ** 2).requires_grad)

# 기울기 추적을 하지 않기 때문에 계산 속도가 더 빠르다.
with torch.no_grad():
    temp = torch.tensor([3.0, 4.0], requires_grad=True)
    print(temp.requires_grad)
    print((temp ** 2).requires_grad)
    
---<결과>---
True
True
True
False

 

반응형

'ML & AI' 카테고리의 다른 글

딥러닝을 이용한 자연어 처리 모음 과정 복습 (NLP)  (0) 2026.04.28
선형대수 복습 겸 정리  (0) 2026.04.28
'ML & AI' 카테고리의 다른 글
  • 딥러닝을 이용한 자연어 처리 모음 과정 복습 (NLP)
  • 선형대수 복습 겸 정리
Feel나는 대로 GI록하는 글
Feel나는 대로 GI록하는 글
세상을 위한 개발자가 되기 위하여
    반응형
  • Feel나는 대로 GI록하는 글
    FeelGI
    Feel나는 대로 GI록하는 글
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • ML & AI (3)
        • 논문 리뷰 (1)
        • Computer Vision (0)
        • Digital Image Processing (1)
      • 알고리즘 (46)
      • 프로그램(대회,공모전,프로그램) (2)
      • 도서 (0)
      • 필기록 (1)
        • 회고록 (0)
        • 끄적끄적 (1)
      • 취업 준비 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 토마토 7576
    파이토치
    28702
    DP #알고리즘 #백준 #Python
    코테
    스택 수열
    FizzBuzz
    백준 토마토
    ICT 학점연계 프로젝트 인턴십
    #코드트리 #코딩테스트 #코테공부 #코테준비 #알고리즘공부 #갭체크
    LG Aimers
    LG AI
    IT대학생
    파이썬
    코딩테스트
    백준
    알고리즘
    동적계획
    14761
    구현 #문자열 #백준 #python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Feel나는 대로 GI록하는 글
[딥러닝, 인공지능] - P1_Ch4 : 파이토치(PyTorch) (1)
상단으로

티스토리툴바