-
Neuron 클래스 만들기
-- 기본 형태 --
class Neuron :
def __init__(self) :
# 초기화 작업 수행
- __init__() 메서드 작성하기
class Neuron :
def __init__(self) :
self.w = 1.0
self.b = 1.0
- 정방향 계산 만들기
- 메서드 forpass를 만든다
- 1차 함수로 제작된 모델을 만든다
def forpass(self, x) :
y_hat = x * self.w + self.b # 직선 방정식 계산
return y_hat
- 역방향 계산 만들기
def backprop(self, x, err) :
w_grad = x * err # 가중치에 대한 그레디언트 계산
b_grad = 1 * err # 절편에 대한 그레디언트 계산
return w_grad, b_grad
-- 오차가 뉴런의 오른쪽 방향에서 왼쪽으로 흐르는 위치
-- 이것을 역방향 계산이라고 함
- Neuron 클래스 정리
class Neuron :
def __init__(self) :
self.w = 1.0 # 가중치를 초기화
self.b = 1.0 # 절편을 초기화
def forpass(self, x) :
y_hat = x * self.w + self.b # 직선 방정식 계산
return y_hat
def backprop(self, x, err) :
w_grad = x * err # 가중치에 대한 그레디언트 계산
b_grad = 1 * err # 절편에 대한 그레디언트 계산
return w_grad, b_grad
- 훈련을 위한 fit() 메서드 구현
- forpass() 메서드를 호출하여 y^를 구한다
- 오차(err)를 계산
- backprop() 메서드를 호출해 가중치와 절편에 대한 그레디언트를 구한다.
- 이 과정을 모든 훈련 샘플에 대해 수행(1 에포크)
- 적절한 가중치와 절편이 구해질만큼(100 에포크) 반복한다.
def fit(self, x, y, epochs=100) :
for i in range(epochs) : # 에포크만큼 반복
for x_i, y_i in zip(x, y) : # 모든 샘플에 대해 반복
y_hat = self.forpass(x_i) # 정방향 계산
err = -(y_i - y_hat) # 오차 계산
w_grad, b_grad = self.backprop(x_i, err) # 역방향 계산
self.w -= w_grad # 가중치 업데이트
self.b -= b_grad # 절편 업데이트
- 모델 훈련(학습시키기)
- Neuron 클래스의 객체 neuron을 생성
- fit() 메서드에 입력 데이터(x)와 타깃 데이터(y)를 전달
neuron = Neuron()
neuron.fit(x, y)
- 학습이 완료된 모델의 가중치와 절편 확인
- 산점도 그려보기
plt.scatter(x, y)
pt1 = (-0.1, -0.1 * neuron.w + neuron.b)
pt2 = (0.15, 0.15 * neuron.w + neuron.b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()
전체 코드
class Neuron :
def __init__(self) :
self.w = 1.0
self.b = 1.0
def forpass(self, x) :
y_hat = x * self.w + self.b # 직선 방정식 계산
return y_hat
def backprop(self, x, err) :
w_grad = x * err # 가중치에 대한 그레디언트 계산
b_grad = 1 * err # 절편에 대한 그레디언트 계산
return w_grad, b_grad
def fit(self, x, y, epochs=100) :
for i in range(epochs) : # 에포크만큼 반복
for x_i, y_i in zip(x, y) : # 모든 샘플에 대해 반복
y_hat = self.forpass(x_i) # 정방향 계산
err = -(y_i - y_hat) # 오차 계산
w_grad, b_grad = self.backprop(x_i, err) # 역방향 계산
self.w -= w_grad # 가중치 업데이트
self.b -= b_grad # 절편 업데이트
neuron = Neuron()
neuron.fit(x, y)
plt.scatter(x, y)
pt1 = (-0.1, -0.1 * neuron.w + neuron.b)
pt2 = (0.15, 0.15 * neuron.w + neuron.b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()
'AI' 카테고리의 다른 글
4-2 시그모이드 함수로 확률 만들기 (0) | 2020.11.18 |
---|---|
4-1 초기 인공지능 알고리즘, 로지스틱 회귀 (0) | 2020.11.18 |
3-3 손실 함수와 경사 하강법의 관계 (0) | 2020.11.17 |
3-2 경사 하강법 학습 (0) | 2020.11.13 |
3-1. 선형 회귀 모델을 이용한 첫번째 문제 해결하기 (0) | 2020.11.13 |