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) 이므로 모든 데이터는 먼저 텐서로 생성시키는 것이 필요함
✔️ 파이 토치에서 데이터를 좀 더 쉽게 다를 수 있도록 TensorDataset과 DataLoader를 제공(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️⃣ 모델 파라미터 최적화
- 학습이 진행됩에 따라 모델 파라미터 업데이트 하면서 최적화
'스터디-ing > AI' 카테고리의 다른 글
[PyTorch] PIDNet 논문 리뷰(PIDNet: A Real-time Semantic Segmentation Network Inspired by PIDControllers) (0) | 2025.01.18 |
---|---|
[PyTorch] 로지스틱 회귀(Logistic Regression) (0) | 2024.10.28 |
[PyTorch] 경사하강법(Gradient decent algorithm) (0) | 2024.10.15 |
[PyTorch] 선형회귀(Linear Regression), 손실함수 (0) | 2024.10.15 |
[PyTorch] 텐서(Tensor) (0) | 2024.10.11 |