이에 그 기본 적인 절차와 내용을 기록해 두고자 합니다.
###########################################################
# 선형 회기 분석
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
- 용어 : https://losskatsu.github.io/machine-learning/epoch-batch/#3-epoch%EC%9D%98-%EC%9D%98%EB%AF%B8
Comments
Post a Comment