Pytorch > Pytorch 입문 > (3) 코드 리뷰 - (1) 선형회기분석
Pytorch > Pytorch 입문 > 선형회기분석
PyTorch 의 모든것은 PyTorch Tutorials 에서 확인 할 수 있지만
다른 언어, 다른 환경에서 몰입 하다 보면, "파이 토치 딥러닝 수행 과정" 이 잘 기억 나지 않을 때가 종종 있습니다.
이에 그 기본 적인 절차와 내용을 기록해 두고자 합니다.
[바로가기]
- (PyTorch docs) https://pytorch.org/docs/stable/index.html
- (한국 사용자 모임) https://tutorials.pytorch.kr/
[파이 토치 딥러닝 수행 과정]
- nn.Module 클래스 상속 받아 (forward 함수를 통해) 모델 아키텍처 클래스 선언
- 해당 클래스 객체 생성
- SGD 등 Optimizer 생성
- 생성 모델의 파라미터를 최적화 대상으로 등록
- 데이터로 미니배치 구성 (for 문 수행)
- feed forward 반복 수행 (연산 그래프 생성)
- 손실 함수를 통해 최종 결과 값 (scalar) 와 손실값 (loss) 계산
- 손실에 대하여 backward 호출
- 연산 그래프 상의 텐서들의 기울기가 채워짐
- 옵테마이저에서 step 을 호출 하여 경사 하상 수행
- 수렴 조건이 만족할 때까지 반복 수행
[선형 회귀 분석 코드 리뷰]
###########################################################
# 선형 회기 분석
import random
import torch
import torch.nn as nn
# 학습 하고자 하는 모델 생성 (상속)
class MyModel(nn.Module):
# 네트워크 구성
def __init__(self, input_size, output_size):
super(MyModel, self).__init__()
# 네트워크 구성
# 추후 forward 로 입력 받을 Layer 계층 이외 의 모든 구성
# - nn.Linear 이내 "nn.Parameter" 는 수행 됨
self.linear = nn.Linear(input_size, output_size)
# x 를 입력 받아 w 곱하기하고 b 편차를 더함
def forward(self, x):
y = self.linear(x) #y = torch.mm(x, W) + b
return y
###########################################################
# 임의의 함수 정의
## y = f(x_1,x_2,x_3) = 3x_1+x_2 - 2x_3
def ground_truth(x):
ground_truth_return = 3 * x[:, 0] + x[:, 1] - 2 * x[:, 2]
print("ground_truth_return {0}".format( ground_truth_return ) )
return ground_truth_return
###########################################################
# 모델과 텐서를 입력 받아 feedforward 수행,
# 역전파 알고지름 수행하여 경사 하강법의 "한 스텝" 수행
def train(model, x, y, optim):
# initialize gradients in all parameters in module.
optim.zero_grad()
y_hat = model(x) # feed-forward 수행, y 을 모델에 넣어 y 예측인 y_hat 확보
# answer and inferenced 간 에러 값
loss = ((y - y_hat)**2).sum() / x.size(0)
loss.backward() # back-propagation
optim.step() # one-step of gradient descent
return loss.data
###########################################################
# Main 수행
###########################################################
batch_size = 1
n_epochs = 10 # 집단 무리,
n_iter = 5
model = MyModel(3, 1) # 네트워크 구성 (input 사이즈, output size)
#optimizer 생성 주로 SGD(Stochastic Gradient Descent)나 Adam 생성함
optim = torch.optim.SGD(model.parameters(), lr=0.0001, momentum=0.1) #
print(" 1. torch.optim.SGD --------- : [" , model , "]\n")
##########################################################
# 모든 epoch
# - 각 epoch
for epoch in range(n_epochs):
avg_loss = 0
#####
# 각 epoch 마다 n_iter 만큼 반복 수행
for i in range(n_iter):
x = torch.rand(batch_size, 3) #임의로 텐서를 생성 -->
y = ground_truth(x.data) #정답 함수에 넣어 정답을 확보
#손실 값을 구해 모델 학습 하기
# - 구현 모델과, x 와 y 의 차이
# - optim , 한 step 수행 --> 학습
loss = train(model, x, y, optim)
avg_loss += loss #누적 손실 -> 평균 내기 위해
# 한 epoch 내 n_iter 반복하여 얻으 평균 loss 값 구하기
avg_loss = avg_loss / n_iter
###################################################################
# simple test sample to check the network.
# epoch 단위 "y = f(x_1,x_2,x_3) = 3x_1+x_2 - 2x_3" 검증용 텐서 생성
x_valid = torch.FloatTensor([[.3, .2, .1]])
# 얻어진 x_valid 를 정답 함수에 넣어 "정답"을 확보
y_valid = ground_truth(x_valid.data)
model.eval() #평가 모드로 전환 (기본은 학습 모드)
y_hat = model(x_valid) # 검증 데이터 x_valid 입력으로 y 예측 값 y_hat 확보
model.train() #다시 학습 모드로 전환
##################################################################
# "y_valid.data[0], y_hat.data[0, 0]" 의 차이로 근사 여부 판단
# simple test sample 인 x_valid 의 y_hat 이
# 기존 학습된 y_valid (학습 검증이 필요)에 근 사 되어 지는 것을 확인
print(avg_loss, y_valid.data[0], y_hat.data[0, 0])
# n_epochs 만큼 반복 학습을 수행하되, 그 과정에서 근사 하게 되면 학습 종료
if avg_loss < .001:
break
[결과]
1. torch.optim.SGD --------- : [ MyModel(
(linear): Linear(in_features=3, out_features=1, bias=True)
) ]
ground_truth_return tensor([0.6122]) # n_iter 내 ground_truth 값, 이후 train,optim
ground_truth_return tensor([2.2992])
ground_truth_return tensor([1.9740])
ground_truth_return tensor([0.8218])
ground_truth_return tensor([-0.1526])
ground_truth_return tensor([0.9000])
tensor(3.9595) tensor(0.9000) tensor(-0.4674) # n_epochs
ground_truth_return tensor([1.0779])
ground_truth_return tensor([1.9274])
ground_truth_return tensor([1.7066])
ground_truth_return tensor([0.1239])
ground_truth_return tensor([0.7213])
ground_truth_return tensor([0.9000])
tensor(3.4216) tensor(0.9000) tensor(-0.4649)
ground_truth_return tensor([1.1843])
ground_truth_return tensor([1.5315])
ground_truth_return tensor([-0.8453])
ground_truth_return tensor([0.5411])
ground_truth_return tensor([2.9766])
ground_truth_return tensor([0.9000])
tensor(4.7910) tensor(0.9000) tensor(-0.4626)
ground_truth_return tensor([3.3473])
ground_truth_return tensor([0.8126])
ground_truth_return tensor([2.0930])
ground_truth_return tensor([-0.2611])
ground_truth_return tensor([0.9762])
ground_truth_return tensor([0.9000])
tensor(6.1908) tensor(0.9000) tensor(-0.4596)
ground_truth_return tensor([1.5612])
ground_truth_return tensor([1.7278])
ground_truth_return tensor([0.0567])
ground_truth_return tensor([1.5653])
ground_truth_return tensor([-0.6958])
ground_truth_return tensor([0.9000])
tensor(3.0491) tensor(0.9000) tensor(-0.4575)
ground_truth_return tensor([-0.2793])
ground_truth_return tensor([0.1960])
ground_truth_return tensor([1.5891])
ground_truth_return tensor([1.8505])
ground_truth_return tensor([0.0595])
ground_truth_return tensor([0.9000])
tensor(2.5226) tensor(0.9000) tensor(-0.4557)
ground_truth_return tensor([0.7098])
ground_truth_return tensor([1.3405])
ground_truth_return tensor([-0.6193])
ground_truth_return tensor([1.5655])
ground_truth_return tensor([1.3473])
ground_truth_return tensor([0.9000])
tensor(2.5948) tensor(0.9000) tensor(-0.4538)
ground_truth_return tensor([3.0331])
ground_truth_return tensor([0.1155])
ground_truth_return tensor([1.0238])
ground_truth_return tensor([-0.4885])
ground_truth_return tensor([1.3030])
ground_truth_return tensor([0.9000])
tensor(4.3670) tensor(0.9000) tensor(-0.4514)
ground_truth_return tensor([-1.5281])
ground_truth_return tensor([-1.0364])
ground_truth_return tensor([1.6226])
ground_truth_return tensor([3.0214])
ground_truth_return tensor([0.3844])
ground_truth_return tensor([0.9000])
tensor(4.7789) tensor(0.9000) tensor(-0.4499)
ground_truth_return tensor([-0.2825])
ground_truth_return tensor([0.6866])
ground_truth_return tensor([2.6080])
ground_truth_return tensor([2.4613])
ground_truth_return tensor([0.4135])
ground_truth_return tensor([0.9000])
tensor(4.7468) tensor(0.9000) tensor(-0.4474)
ref
- 김기현의 자연어 처리 딥러닝 캠프(파이토치 편)
- 위키피디아 : https://ko.wikipedia.org/wiki/선형_회귀
- 최적화: https://blog.naver.com/slykid/222297529363
- 용어 : https://losskatsu.github.io/machine-learning/epoch-batch/#3-epoch%EC%9D%98-%EC%9D%98%EB%AF%B8
Comments
Post a Comment