파이토치 (2) - 기본 문법 책내용 정리

이영락·2024년 7월 22일

개발자 기본기

목록 보기
8/53

1. 3 | 왜 딥러닝에 파이토치인가?


📢 2022년 3월 기준 파이토치는 논문에서 가장 많이 사용하는 딥러닝 프레임워크다.
  • 다양한 플렛폼에서 사용이 가능
  • 파이토치는 픽셀의 가로세로 위치와 RGB값중 RGB값을 먼저 고려함
  • 동적 계산 그래프를 활용함
    • 중간에 변수의 값을 바꿀 수 있다.
    • 장작 계산 그래프는 값을 바꿀수는 없지만 계산 속도가 빠르다.

1. 4 | 파이토치 권고 코딩 스타일

📢 파이토치는 클래스를 사용하도록 권장
  1. 모듈 클래스 = 신경망을 만든다
  2. 데이터셋 클래스 = 데이터를 불러와 학습한다.

모듈 클래스(nn.Module 클래스)

파이토치 신경망 기본 구성

class Net(nn.module):
	def __init__(self):
	
		'''

		# 신경망 구성요소 정의
	
		'''
	
	def forward(self,input):
		
		'''
		
		# 신경망의 동작 정의
		
		'''
  • `init()` : 신경망 구성 요소 정의
  • forward() : 신경망의 동작 정의

데이터 클래스(nn.Module 클래스)

파이토치 데이터셋 기본 구성

class Dataset():
	def __init__(self):
	
		'''

		필요한 데이터 불러오기
	
		'''
	
	def __len__(self):
		
		'''
		
		데이터의 갯수 반환
		
		'''
	
	def __getitem__(self,i):
		
		'''
		
		i번째 입력 데이터와 i번째 정답을 반환
		
		'''
		return data[i],label[i]

딥러닝 학습 진행

파이토치 데이터셋 기본 구성

# 데이터로더로부터 데이터와 정답을 받아옴
for data,label in Dataloader():
	# 모델의 예측값 계산
	prediction = model(data)
	
	# 손실 함수를 이용해 오차 계산
	loss = LossFunction(prediction,label)
	
	# 오차 역전파
	loss.backward()
	
	# 신경망 가중치 수정
	optimizer.step()

3.2 보스턴 집값 예측하기 : 회귀 분석

보스턴 데이터셋의 특징 출력

from sklearn.datasets import load_boston

# 경고 무시
import warnings
warnings.filterwarnings('ignore')

dataset = load_boston() # 데이터셋을 불러옴
print(dataset.keys())   # 데이터셋의 키(요소들의 이름)를 출력

데이터 구성 요소 확인

import pandas as pd

from sklearn.datasets import load_boston

dataset = load_boston()
dataFrame = pd.DataFrame(dataset["data"]) # ❶ 데이터셋의 데이터 불러오기
dataFrame.columns = dataset["feature_names"] # ❷ 특징의 이름 불러오기
dataFrame["target"] = dataset["target"] # ❸ 데이터 프레임에 정답을 추가

print(dataFrame.head()) # ➍ 데이터프레임을 요약해서 출력

선형회귀를 위한 MLP 모델의 설계

import torch
import torch.nn as nn

from torch.optim.adam import Adam

# ❶ 모델 정의
model = nn.Sequential(
   nn.Linear(13, 100),
   nn.ReLU(),
   nn.Linear(100, 1)
)

X = dataFrame.iloc[:, :13].values # ❷ 정답을 제외한 특징을 X에 입력
Y = dataFrame["target"].values    # 데이터프레임의 target의 값을 추출

batch_size = 100
learning_rate = 0.001

# ❸ 가중치를 수정하기 위한 최적화 정의
optim = Adam(model.parameters(), lr=learning_rate)

# 에포크 반복
for epoch in range(200):

   # 배치 반복
   for i in range(len(X)//batch_size):
       start = i*batch_size      # ➍ 배치 크기에 맞게 인덱스를 지정
       end = start + batch_size

       # 파이토치 실수형 텐서로 변환
       x = torch.FloatTensor(X[start:end])
       y = torch.FloatTensor(Y[start:end])

       optim.zero_grad() # ❺ 가중치의 기울기를 0으로 초기화
       preds = model(x)  # ❻ 모델의 예측값 계산
       loss = nn.MSELoss()(preds, y) # ❼ MSE 손실 계산
       loss.backward()
       optim.step()

   if epoch % 20 == 0:
       print(f"epoch{epoch} loss:{loss.item()}")
prediction = model(torch.FloatTensor(X[0, :13]))
real = Y[0]
print(f"prediction:{prediction.item()} real:{real}")

🤔 배치와 에포크?

🫠 배치 : 전체 데이터를 나눠서 학습하는 단위

  • 사전적 정의 : 딥러닝 모델의 가중치를 업데이트 시킬때 사용되는 데이터의 묶음 단위
  • 컴퓨터의 메모리는 한정적이기 때문에 모든 데이터를 한번에 처리 불가
    → 전체 데이터를 나눠서 학습함!

🫠 에포크 : 배치 크기 만큼 학습해서 전체 데이터 모두를 학습

  • 사전적 정의 : 배치 크기 단위로 전체 데이터 모두를 학습하는 단위
  • 배치크기로 n번 학습해 전체 데이터를 1번 학습 완료! = 1에포크

🫠 이터레이션 : 1에포크를 완성시키는 데 필요한 배치의 반복 횟수

이터레이션(반복 횟수) 배치(한번 학습 데이터하는 양) = 1에포크(전체 데이터 학습 완료!)*


profile
AI Engineer / 의료인공지능

0개의 댓글