[딥러닝 복습]파이토치 개요

김태경 SMARCLE·2025년 7월 17일

딥러닝

목록 보기
1/3

2.1. 파이토치

GPU에서 텐서 조작 및 동적 신경망 구축이 가능한 프레임워크

  • 동적 신경망 : 학습을 반복할 때마다 은닉층을 추가하거나 제거하는 등의 일이 가능한 모델
import torch
torch. tensor([[1, 2], [3, 4]])

텐서 생성법.

특징

  • 단순함 - 디버깅이 직관적
  • cpu를 별로 안 씀 & 빠르고 쉬움
  • 직관적인 인터페이스
  • 무슨플로우처럼 .layers 이런거 없음

아키텍쳐

3개 계층으로 이루어짐

  1. 가장 위 - 파이토치 API
    • torch - 다차원 텐서 기반 수학적 연산 패키지, GPU에서도 연산 가능
    • torch.autograd - 자동 미분 패키지
    • torch.nn - 모델 구축용 코드가 있는 패키지
    • torch.multiprocessing - 파이토치 프로세스 전반에 걸쳐 텐서의 메모리 공유를 가능하게 하는 패키지
    • torch.utils - 기타 등등이 들어있는 패키지
  2. 그 다음 - 파이토치 엔진
    • 파이썬API - C++로 감싼 파이토치
    • autograd C++ - 가중치/바이어스 계산에 필요한 미분 자동 계산기
    • Aten C++ - C++ 텐서 라이브러리 제공
    • JIT C++ - 계산 최적화용 컴파일러
  3. 가장 아래 - 텐서 연산 처리
    • C 또는 CUDA 패키지 - 위에서 하는 모든 계산을 수행

텐서

파이토치의 핵심.

  • 오프셋 - 텐서의 첫번째 요소가 스토리지에 저장된 인덱스.
  • 스트라이드 - 각 차원에 따라 다음 값을 얻기 위해 스킵이 필요한 스토리지의 요소 개수.

2.2. 파이토치 기초 문법

텐서 생성 및 변환

import torch
print(torch.tensor([[1, 2], [3, 4]]))
print(torch.tensor([[1, 2], [3, 4]], device="cuda:0"))
print(torch.tensor([[1, 2], [3, 4]], dtype=torch.float64))

넘파이의 ndarray와 비슷함.

텐서->ndarray 변환

tmp=torch.tensor([[1, 2], [3, 4]])
print(tmp.numpy())

tmp2=torch.tensor([[1, 2], [3, 4]], device="cuda:0")
print(tmp2.to("cpu").numpy())

텐서 인덱스 조작

tmp=torch.tensor([1,2,3,4,5,6,7,8])
tmp[0] # 1
tmp[4:-1] # 5 6 7
tmp[1:3] # 2 3 4

이렇게 가능.

연산 : 그냥 + - 하면 됨.

텐서의 차원 조작

tmp=torch.tensor([[1, 2], [3, 4]])
tmp.shape #[2, 2]
tmp.view(4, 1) # [[1], [2], [3], [4]]
tmp.view(1, 4) # [1, 2, 3, 4]
tmp.view(1, -1) # [1, 2, 3, 4] - -1은 앞에거에 맞춰서 자동으로 배정됨

view 함수를 이용해 형태 조작 가능

데이터 준비 - 2가지 방법이 있음

  • 단순하게 pd.read_csv 하기
  • 커스텀 데이터셋 만들기

커스텀 데이터셋 만들기 : 데이터를 한번에 불러오면 너무 느리니까, 여러개로 쪼개서 나눠서 불러오는 법

class customdataset(torch.utils.data.Dataset):
	def __init__(self): # 필요한 변수 선언 및 전처리
    def __len__(self): # 데이터 길이= 샘플 수
    def __getitem__(self, index): # 데이터 불러오기

이런 클래스를 하나 만들어주면 된다.

그 외에도 귀찮으면 파이토치나 판다스에서 기본 제공하는 데이터를 불러와도 실습은 가능.

모델 정의

  • 레이어 : 한개의 연산 계층
  • 모듈 : 여러 레이어가 모여 구성된 것
  • 모델 : 하나 이상의 모듈이 모인 것 = 최종적으로 구성되는 네트워크

단순히 레이어 하나만 쌓으려면 이거면 된다.

model=nn.Linear(in_features=1, out_features=1, bias=True)

모듈을 상속하여 쓰려면 이러면 된다.

class MLP(Module):
	def __init__(self, inputs):
    	super(MLP, self).__init__()
        self.layer = Linear(inputs, 1)
        self.activation = Sigmoid()
        
    def forward(self, X):
    	X = self.layer(X)
        X = self.activation(X)
        return X

기본적으로 init에 사용될 모듈과 활성화 함수를 넣고, forward에서는 실행될 연산을 넣으면 된다.

seqential 모델을 정의할거면 이러면 된다.

import torch.nn as nn
class MLP(nn.Module):
	def __init__(self, inputs):
    	super(MLP, self).__init__()
        self.layer1 = nn.Sequential(
        	nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2))
            
        self.layer2 = nn.Sequential(
        	nn.Conv2d(in_channels=64, out_channels=30, kernel_size=5),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2))
            
        self.layer3 = nn.Sequential(
        	nn.Linear(in_features=30*5*5, out_features=10, bias=True),
            nn.ReLU(inplace=True),
        
    def forward(self, X):
    	X = self.layer1(X)
        X = self.layer2(X)
        X = X.view(X.shape[0], -1)
        X = self.layer3(X)
        return X
        
model=MLP()

텐서플로우랑 비슷한듯
모델 계층이 복잡할수록 성능이 좋지만 그만큼 과적합 가능성도 높아짐

파라미터 정의

이런걸 미리 정의하면 된다.

  • 로스
  • 옵티마이저
  • 스케줄러 - 지정한 에포크 수를 지날때마다 학습률이 줄어들게 함
  • 메트릭 - 평가 지표

그 이후

이제 train하고->오차가 줄어드는 방향으로 가중치 조정하고->torchmetrics 불러와서 모델 평가하고->필요하면 학습 과정 자체를 모니터링하면 된다.

2.3. 환경 설정

아나콘다 홈페이지에 들어가서->설치 프로그램 다운받고->설치 시작->i agree->계속 next->설치하고->환경변수 설정해서->가상환경 설정하고->다시 pip install pytorch 한다음에->시작

캐글 그는 신이야...

2.4. 파이토치 코드 맛보기

0. 라이브러리 불러오기

작년 캐글스터디-머신러닝스터디 했을 때랑 똑같은데, 이 라이브러리들이 추가로 호출된다.

import torch
import torch.nn as nn

나머지 넘파이나 판다스는 항상 불러오는거고.

1. 데이터 준비

늘 그렇듯이 pd.read_csv로 csv 파일 가져와서 쓴다.
필요하다면 시각화를 하고, 카테고리컬 컬럼이라면 임베딩 또는 인코딩을 할 것.

2. 전처리

학습에서 어떻게보면 가장 귀찮고 가장 중요한 단계. 하던대로 ㄱㄱ
주의할 점이라면 모든 데이터를 텐서로 변환해야 한다.
파이토치는 텐서 기반이기 때문에, 얘도 단어는 못 읽는다. 기존에 숫자형 컬럼인거라면 괜찮음.

카테고리컬 컬럼->dataset[category]->넘파이 배열->텐서 순으로 바꿔주면 해결.

2개 이상의 넘파이 객체를 합치는 경우 np.stack을 쓸 수 있다.

단순 레이블 형의 경우는 get_dummies를 활용해도 넘파이 배열로 변경 가능.

3. 모델 만들기

아까 위에서 sequential 이용해서 만든것처럼 모델을 클래스 정의해서 만들면 된다.

레이어 구조, 파라미터, 로스, 옵티마이저, 평가 지표 등을 여기서 정한다.

4. 학습시키기

보통은 에포크 수를 설정하고, for문을 이용해 모델 결과 값과 loss 펑션을 수동으로 값을 받으면서 학습을 진행한다.
이 때 에포크 몇 단위로 중간 결과를 저장하거나 출력하는것도 좋음.

5. 평가

결과 로스나, 평가 지표를 이용해 모델이 잘 학습되었는지 판단하고, 아니라고 판단되는 경우 앞으로 돌아간다.

잘 학습되었다면 이대로 완성.

참고하기 좋은 외부 자료

https://velog.io/@oneman98/%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-%EA%B5%90%EA%B3%BC%EC%84%9C-2%EC%9E%A5-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%EA%B3%BC-%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-%EA%B8%B0%EC%B4%88#24-%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-%EC%BD%94%EB%93%9C-%EB%A7%9B%EB%B3%B4%EA%B8%B0
이 교재를 더 깔끔하게 정리한 velog인데 공부할 때 내가 이해한 내용이랑 얼마나 다른지 비교하면서 보기 좋았음.

profile
네이버 블로그 업로드 전 개념정리용

0개의 댓글