본문 바로가기

스터디-ing/AI

[PyTorch] 모델 구조

PyTorch를 공부하면서 참고한 NeoWizard(박성호)님의 YouTube영상을 토대로 내용을 정

실제 영상 강의를 보고 싶은 분들은 아래 링크로 ㄱㄱ!

출처: https://www.youtube.com/@NeoWizard

 

NeoWizard

강의실 - 머신러닝, 딥러닝 - 텐서플로우 1.x, 텐서플로우 2.x - PyTorch, 파이토치 - YOLO - 프로그래밍 - 데이터분석, 판다스

www.youtube.com

 

신경망(Neural Network)

신경망 모델 구축

 

✔️ 1️⃣ 데이터를 정의하고 2️⃣ 모델 구축이 완료되면 3️⃣ 피드포워드를 통해 4️⃣ 손실함수를 계산하고 5️⃣ 손실함수가 최소가 될 때까지 옵티마이저, 즉 최적화 알고리즘을 이용해서 모델 파라미터(가중치, 바이어스) 값을 찾아가는 과정(3️⃣~5️⃣)을 반복하는 과정을 통해 딥러닝 학습이 진행됨.

 

1️⃣ 데이터 정의
import torch
from torch import nn

x_train = torch.Tensor([1, 2, 3, 4, 5, 6]).view(6,1)
y_train = torch.Tensor([3, 4, 5, 6, 7, 8]).view(6,1)
     

import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

x_train = torch.Tensor([1, 2, 3, 4, 5, 6]).view(6,1)
y_train = torch.Tensor([3, 4, 5, 6, 7, 8]).view(6,1)

dataset = TensorDataset(x_train, y_train)

dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

✔️ 파이토치 기본 데이터 타입은 텐서(Tensor) 이므로 모든 데이터는 먼저 텐서로 생성시키는 것이 필요함

✔️ 파이 토치에서 데이터를 좀 더 쉽게 다를 수 있도록 TensorDatasetDataLoader를 제공(batch_size, shuffle 등 옵션)

 

모델 구축(2️⃣ 모델~ 3️⃣ 피드포워드)
# 신경망 모델 클래스 상속
class MyNeuralNetwork(nn.Module):
	# 신경망 모델을 구성하는 계층(Layer) 정의
	# 위 그림에서 2️⃣모델(model)의 입력층/은닉층/출력층 계층의 순서를 정의
    def __init__(self):
        super().__init__()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(1,1)
        )

	# 피드포워드를 수행하고 결과값을 리턴함
	# 3️⃣피드포워드를 통해서 데이터가 어떻게 전달되고 개선되는지 정의
    def forward(self, x):
        logits = self.linear_relu_stack(x)
        return logits

✔️ 신경망 모델 클래스를 상속 받아 __init__ 함수를 통해 2️⃣ 모델(model)의 입력층/은닉층/출력층 계층의 순서를 정의

✔️ forward 함수를 통해 3️⃣ 피드포워드를 통해서 데이터가 어떻게 전달되고 개선되는지 정의

 

3️⃣ 피드 포워드 / 4️⃣ 손실함수 계산 / 5️⃣ 모델 파라미터 최적화(optimizer)

✔️ 모델을 학습시키려면 3️⃣ 피드 포워드 계산값과 정답의 차이인 오차(loss)를 계산하는 4️⃣ 손실함수(loss function)와 5️⃣ 옵티마이저(optimizer)가 필요함

model = MyNeuralNetwork()

# 일반적인 선형회귀(regression)에서는 손실함수로 MSE(평균적 오차)사용
# 분류(classification) 데이터에는 nn.CrossEntropyLoss() 사용
loss_function = nn.MSELoss()

# SGD(확률적 경사하강법)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)

✔️ 일반적인 선형회귀(regression)에서는 손실함수로 MSE(평균적 오차)사용
✔️ 분류(classification) 데이터에는 nn.CrossEntropyLoss() 사용

✔️ 옵티마이저에 확률적 경사하강법(SGD, Stochastic Gradient Descent) 외에 ADAM, RMSProp 등의 다양한 옵티마이저가 있음

✔️ 옵티마이저를 이용한 모델 파아미터 최적화하는 과정을 오차를 역전파한다고 함.

 

nums_epoch = 2000

for epoch in range(nums_epoch+1):
    # 3️⃣ 피드포워드를 통한 손실을 예측
    # 모델에 입력값(x_train) 전달(입력층 -> 은닉층 -> 출력층)
    # 모델에 데이터 전달하면 forward() 함수가 자동으로 실행돼 직접 호출할 필요X
    prediction = model(x_train)
    # 4️⃣ 개선값을 바탕으로 정답값(y_train)과 차이인 오차(loss)를 계산
    loss = loss_function(prediction, y_train)
	
    # 5️⃣ 모델 파라미터 최적화
    # 학습이 진행됩에 따라 모델 파라미터 업데이트 하면서 최적화
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0:
        print('epoch = ', epoch, ' current loss = ', loss.item())
 
 
# epoch =  0  current loss =  37.05191421508789
# epoch =  100  current loss =  0.3001045882701874
# epoch =  200  current loss =  0.1444464772939682
# epoch =  300  current loss =  0.06952487677335739
# epoch =  400  current loss =  0.033463768661022186
# epoch =  500  current loss =  0.0161068607121706
# epoch =  600  current loss =  0.0077525838278234005
# epoch =  700  current loss =  0.003731468925252557
# epoch =  800  current loss =  0.0017960291588678956
# epoch =  900  current loss =  0.0008644519839435816
# epoch =  1000  current loss =  0.0004160820972174406
# epoch =  1100  current loss =  0.00020027178106829524
# epoch =  1200  current loss =  9.638969640946016e-05
# epoch =  1300  current loss =  4.6396893594646826e-05
# epoch =  1400  current loss =  2.2332458684104495e-05
# epoch =  1500  current loss =  1.0748007298388984e-05
# epoch =  1600  current loss =  5.1740644266828895e-06
# epoch =  1700  current loss =  2.4905057216528803e-06
# epoch =  1800  current loss =  1.1989213817287236e-06
# epoch =  1900  current loss =  5.773050588686601e-07
# epoch =  2000  current loss =  2.780373336008779e-07

✔️ 3️⃣ 피드포워드를 통한 손실을 예측

  • 모델에 입력값(x_train) 전달(입력층 -> 은닉층 -> 출력층)
  • 모델에 데이터 전달하면 forward() 함수가 자동으로 실행돼 직접 호출할 필요X

✔️ 4️⃣ 개선값을 바탕으로 정답값(y_train)과 차이인 오차(loss)를 계산

✔️ 5️⃣ 모델 파라미터 최적화

  • 학습이 진행됩에 따라 모델 파라미터 업데이트 하면서 최적화