머신러닝

초보자를 위한 선형회귀법 예제 PyTorch 코딩

coding art 2019. 6. 27. 15:16
728x90


파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자.  머신 러닝을 배우려는 초보자들이 가지게

될 의문점들을 찾아내어  실제 내용과 결과를 확인해볼 수 있도록  완전히 뒷문(?)으로 들어가

시작하는 머신 러닝! 우선 아래 url 을 방문하여 url 로 구성된 본 서의 목차 파일을 무료로 다운로드 받아

펼쳐서 살펴보시기 바랍니다.

 파이선 코딩 초보자를 위한 톈서플로우∙OpenCV 머신러닝 머리말과 url

목차 파일 다운로드
https://steemit.com/kr/@codingart/pryx1-opencv


450페이지 19900원 교모문고 퍼플에서 도서주문판매로만 판매중입니다.

noname03.png

_________________________________________________________________________________________


그림의 선형회귀법 예제에서 미지수인 웨이트 값

wregression 기법으로 찾아보자. 처음에서 random number 나 임의의 상수 값으로부터 시작하면 된다.


 

이 웨이트 값 wPyTorch 머신 러닝 과정의 중요 변수이므로 반드시 torch.Tensor로 선언되어야 torch 라이브러리의 지원을 받아 regression 이 가능해짐에 유의하자.

 

선형 회귀법 예제에 필요한 라이브러리는 torch autograd 이다. matplotlib plot을 지원하는 파이선 라이브러리이며 numpy 도 파이선 러이브러리인데 이 예제에 한해서는 필수적인 것은 아니다. PyTorchTensorFlow 머신 러닝 코드를 다루다 보면 torch Tensor TensorFlow Tensor 또는 Pandas 수치들을 다루는 과정에서 numpy 로 변환해서 처리해야할 경우가 많으므로 항상 넣어 두는 것이 좋다.

 

PyTorch 선형회귀 예제에서도 필요한 입력 데이터들더블클릭을 하시면 이미지를 수정할 수 있습니다은 리스트 형으로 정의 한다.

웨이트 wtorch.Tensor 1.0 으로 선언한다. requires_grad 속성은 True 로 선언해 두어야 autograd에 의한 자동 미분이 가능해진다. 아울러 autograd 라이브러리 지원하에 Variable을 선언하게 되면 .data .grad. 와 같은 텐서(raw tensor)들을 사용할 수 있게 된다. raw tensor는 별도로 선언한 텐서가 아닌 생겨난 그대로의 텐서를 뜻한다.



초기 웨이트 값 w가 주어졌으면 다음과 같이 변화되는 웨이트 값과 loss 함수 값을 추적하기 위한 w_list l_list를 리스트형으로 선언한다. loss 함수의 최소 값을 찾아내기 위해서 10회의 epoch를 설정한다. epoch 별로 3개의 데이터에 대한 loss 함수 값과 웨이트 w에 대한 미분 기울기 값을 계산한다.

미분 기울기 값은 learning rate 값과 곱하여 다음 번 epoch 에서의 새 웨이트 값 w를 계산하고 미분값을 저장했던 grad.data0.0으로 초기화 시킨다.

참고로 웨이트 wautograd Variable 로 지정했기 때문에 method .dataraw tensor이며 아울러 이 변수 w에 대한 미분 값은 method.grad. 에 누적됨에 유의하자.



#pytirch linear regression

import torch

from torch.autograd import Variable

import numpy as np

import matplotlib.pyplot as plt

 

x_data = [1.0, 2.0, 3.0]

y_data = [2.0, 4.0, 6.0]

w = Variable(torch.Tensor([1.0]), requires_grad=True)

def forward(x):

return x * w

def loss(x, y):

y_pred = forward(x)

return (y_pred - y) * (y_pred - y)

print("predict (before training)", 4, w, forward(4).data[0])

 

w_list = []

l_list = []

w.data = w

for epoch in range(10):

for x_val, y_val in zip(x_data, y_data):

l = loss(x_val, y_val)

l.backward()

w.data = w.data - 0.01 * w.grad.data[0]

print("\tgrad: ", x_val, y_val, w.data[0], w.grad.data[0])

w_list.append(w.data[0])

l_list.append(l.data[0])

w.grad.data.zero_()

print("progress:", epoch, l.data[0])

plt.plot(w_list, l_list)

plt.ylabel('Loss')

plt.xlabel('w')

plt.show()