HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
장지원 페이지/
📑
AI Basic
/
#02. PyTorch : Overview

#02. PyTorch : Overview

상태
진행 중
태그
PyTorch
📌
PyTorch 설치 및 기본 개념에 대해서 알아보자.
 

[PyTorch Overview]

What?
GPU에서 텐서 조작 및 동적 신경망 구축이 가능한 프레임워크
GPU : 연산 속도를 빠르게 하는 역할을 한다.
  • 미분 계산 처리가 빨라진다.
  • CUDA, cuDNN 등의 API를 이용해서 GPU를 사용할 수 있다.
  • 병렬 연산에서 CPU 보다 빠른 처리 속도를 가진다.
텐서 : Tensor
  • 데이터 형태이다.
  • 데이터들의 다차원 행렬이다.
Vector, Matrix, Tensor?
📌
벡터, 행렬, 그리고 텐서란? 벡터 : 인공지능에서 데이터는 보통 벡터로 표현된다. 1차원 배열이다. 행렬 : 2차원 배열이다. 텐서 : 3차원 이상의 배열이다. 파이토치에서는 torch.tensor 명령어를 통해서 tensor를 생성한다.
동적 신경망 : 훈련을 반복할 때 마다 네트워크 변경이 가능한 신경망이다.
  • 학습 중에 은닉층을 추가하거나 제거하는 등의 연산이 가능하다.
Architecture
notion image
API
텐서에 대한 처리 및 신경망을 구축하고 훈련할 수 있도록 돕는다.
이 계층에서는 사용자를 위한 인터페이스를 제공해 주지만 실제 연산은 수행하지 않는다.
패키지
다음과 같은 지원 패키지들이 있다.
torch
GPU 지원
torch.autograd
자동 미분
실시간 계산을 도와준다. 다양한 신경망을 손쉽게 구축할 수 있다는 장점이 있다.
torch.nn
신경망 구축
신경망 구축을 쉽게할 수 있도록 돕는다.
torch.multiprocessing
멀티프로세싱
여러 프로세스에서의 동일한 텐서에 대한 접근을 도와준다.
torch.utils
Etc…
데이터 제공, 디버깅, 체크 등 ‘활용’ 기능을 제공한다.
엔진
연산을 위한 여러 API를 제공한다.
연산 처리
상위 API에서 할당된 연산을 수행한다.
 

[PyTorch’s Basic Grammer]

Producing Tensor
텐서를 다루는 방법이다.
텐서 생성 및 변환
텐서를 생성해보자.
import torch print(torch.tensor([[1,2],[3,4]])) #2차원 형태 텐서 생성 print('------------------------') #print(torch.tensor([[1,2],[3,4]], device="cuda:0")) #GPU가 없다면 오류가 발생하므로 주석 처리 print('------------------------') print(torch.tensor([[1,2],[3,4]], dtype=torch.float64)) #type을 지정하여 텐서 생성 #Result tensor([[1, 2], [3, 4]]) ------------------------ ------------------------ tensor([[1., 2.], [3., 4.]], dtype=torch.float64)
텐서를 numpy의 ndarray로 변환해보자.
temp = torch.tensor([[1,2],[3,4]]) print(temp.numpy()) #텐서를 ndarray 형태로 변환 print('------------------------') #temp = torch.tensor([[1,2],[3,4]], device="cuda:0") #GPU가 없다면 오류가 발생하므로 주석 처리 temp = torch.tensor([[1,2],[3,4]], device="cpu:0") print(temp.to("cpu").numpy()) #GPU상의 텐서를 CPU의 텐서로 변환한 후 ndarray로 변환 #Result [[1 2] [3 4]] ------------------------ [[1 2] [3 4]]
텐서의 인덱스 조작
텐서의 인덱스를 조작해보자.
텐서는 ndarray를 조작하는 것과 유사하기 때문에 인덱스 접근, 슬라이싱 등의 작업이 가능하다.
참고 : 텐서의 데이터 타입
  • torch.FloatTensor : 32비트의 부동 소수점
  • torch.DoubleTensor : 64비트의 부동 소수점
  • torch.LongTensor : 32비트의 부호가 있는 정수
temp = torch.FloatTensor([1, 2, 3, 4, 5, 6, 7]) #파이토치로 1차원 배열 생성 print(temp[0], temp[1], temp[-1]) #인덱스 접근 print('------------------------') print(temp[2:5], temp[4:-1]) #슬라이싱 #Result tensor(1.) tensor(2.) tensor(7.) ------------------------ tensor([3., 4., 5.]) tensor([5., 6.])
텐서의 연산 및 차원 조작
텐서로 연산을 해보자.
ndarray 처럼 다양한 연산이 가능하고, GPU를 사용하면 더 빠른 연산이 가능하다. 단 텐서 간 데이터 타입이 다르면 연산이 불가능하다.
v = torch.tensor([1, 2, 3]) w = torch.tensor([3, 4, 6]) print(w - v) #텐서 간 뺄셈 #Result tensor([2, 2, 3])
텐서의 차원을 조작해보자.
텐서 차원 변경은 중요하게 다루어지므로 주의 깊게 살펴보아야 한다.
view : 넘파이의 reshape와 유사하다.
cat : 서로 다른 길이의 텐서를 하나로 병합한다.
transpose : 전치, 순서 변경 등에 사용한다.
temp = torch.tensor([ [1, 2], [3, 4] ]) #2by2 행렬 생성 print(temp.shape) #형태 출력(사이즈: 2by2) print('------------------------') print(temp.view(4,1)) #2by2 행렬을 4by1로 변경 print('------------------------') print(temp.view(-1)) #2by2 행렬을 1차원 벡터로 변경 print('------------------------') print(temp.view(1, -1)) #(1,?)와 같은 의미. 다른 차원으로 부터 ? 값 유추. 여기서는 원소의 개수가 4개이고, (1,?) 형태 만족해야 하므로 (1,4)가 된다. print('------------------------') print(temp.view(-1, 1)) #(?,1)와 같은 의미. 다른 차원으로 부터 ? 값 유추. 여기서는 원소의 개수가 4개이고, (?,1) 형태 만족해야 하므로 (4,1)가 된다. #Result torch.Size([2, 2]) ------------------------ tensor([[1], [2], [3], [4]]) ------------------------ tensor([1, 2, 3, 4]) ------------------------ tensor([[1, 2, 3, 4]]) ------------------------ tensor([[1], [2], [3], [4]])
✏️
중요 : 텐서를 메모리에 저장하기 텐서를 메모리에 저장될 때에는 1차원 배열이 된다. 1차원 배열 형태여야만 메모리에 저장할 수 있다. 그리고 변환된 1차원 배열을 storage라고 한다. - 오프셋(offest) : 텐서의 첫 번째 요소가 스토리지에 저장된 인덱스 - 스트라이드(stride) : 각 차원에 따라 다음 요소를 얻기 위해 건너뛰기가 필요한 스토리지의 요소의 개수 (행 중심으로 스트라이드는 항상 1이다)
 
다음과 같은 두 행렬이 있다. (오른쪽 행렬은 왼쪽 행렬의 전치) 두 행렬을 메모리에 저장하기 위해 1차원으로 바꾼다고 생각해보자.
 
실제 두 행렬의 shape는 다르지만 스토리지의 값들은 서로 같다. 따라서 스토리지 형태에서의 행렬들을 구분하기 위해서 오프셋과 스트라이드를 사용한다. 왼쪽 행렬에 대한 스토리지 스트라이드를 구해보자 : (3,1) 오른쪽 전치 행렬에 대한 스토리지 스트라이드를 구해보자 : (2,1)
Data Preparation
데이터를 호출하는 방법이다.
판다스 라이브러리를 이용해서 호출하는 방법과 파이토치에서 제공하는 데이터를 이용하는 방법, 두 가지가 있다. (데이터가 전처리 되지 않았다면, 전처리를 진행한 후에 학습을 진행해야한다)
파일을 불러와서 사용
JSON, PDF, CSV 등의 파일을 불러와 사용해보자.
판다스 라이브러리를 활용해 파일을 불러와서 사용할 수 있다.
(pip install pandas 명령어를 통해 라이브러리를 설치한 후 이용해야 한다)
커스텀 데이터 셋을 만들어서 사용
커스텀 데이터셋을 만들어서 사용해보자.
인공지능은 대량의 데이터를 이용해서 모델을 학습시킨다. 하지만 데이터를 한 번에 불러와서 훈련시키면 시간과 비용 측명에서 효율적이지 않다. 데이터를 한 번에 다 부르지 않고 조금씩 나누어 부르는 방식이 커스텀 데이터 셋이다.
class CustomDataset(torch.utils.data.Dataset): def __init__(self): #필요한 변수 선언 및 데이터 전처리 def __len__(self): #데이터 셋의 길이, 총 셈플의 수를 가져오는 함수 def __getitem__(self, index): #데이터 셋에서 특정 데이터를 가져오는 함수, 이 때 반환 형태는 텐서이다.
파이토치에서 제공하는 데이터 셋을 사용
파이토치에서 제공하는 데이터 셋을 사용해보자.
다음 URL에서 파이토치가 제공하는 데이터 셋을 확인할 수 있다.
(pip install requests 명령어를 통해 라이브러리를 설치한 후 이용해야 한다)
Model Define
모델을 정의하는 방법이다.
모델을 정의하기 위해서는 모듈을 상속한 class를 사용해야 한다.
✏️
기본 용어
  • 계층(layer) : 모듈 또는 모듈을 구성하는 한 개의 계층으로 합성곱층(convolutional layer), 선형계층(linear layer) 등이 있다.
  • 모듈(module) : 한 개 이상의 계층이 모여서 구성된 것으로, 모듈이 모여 새로운 모듈을 만들 수 있다.
  • 모델(model) : 최종적으로 원하는 네트워크로, 한 개의 모듈이 모델이 될 수도 있다.
 
Model Parameter Define
Model Training
Model Evaluation