728x90
반응형
딥러닝을 배우면 정말 지긋지긋하게 나오는 경사하강법입니다.
좀 제대로 머리에 경사하강법 원리를 익히기 위해 여러 소스를 참고해서 파이썬 코드를 작성했습니다.
import numpy as np
import matplotlib as plt
def function(x1, x2): #손실함수 임의로 정의
return 0.5*x1**2 + (5/2)*x2**2 - x1*x2 - 2*(x1 + x2)
def gradient(x1, x2): #각 값에 대한 미분식 제시
return np.array([-2 + x1 - x2, -2 - x1 + 5*x2])
x1 = 2 #x1, x2를 임의 값으로 설정
x2= 1
lr = 0.1 # step size (learning rate, 실험을 위해 크게 설정함)
precision = pow(10,-6) #epsilon 이 값 이하로 오차가 줄어들시에 계산을 멈춤
original = function(x1,x2) # 훈련을 시작하는 첫 식
record = [[x1,x2]]
grad = gradient(x1,x2)
while abs(x2-x1) > precision:
x1 = x1 - lr*grad[0]
x2 = x2 - lr*grad[1]
diff = function(x1,x2) - original
record = np.vstack((record,[x1,x2])) #업데이트 과정에 따라 값을 보관함
original = function(x1,x2)
grad = gradient(x1,x2)
record_x1 = record[:,0] #쌓아놓았던 값에서 x1값들, x2값들을 분리함
record_x2 = record[:,0]
# ------------------------그래프 그리는 과정--------------------------
x1 = np.linspace(2, 3.5, 150)
x2 = np.linspace(0.25, 1.75, 150)
X1, X2 = np.meshgrid(x1, x2)
Z = function(X1, X2)
fig = plt.figure(figsize = (10,7))
contours = plt.contour(X1, X2, Z, 20)
plt.clabel(contours, inline = True, fontsize = 10)
plt.title("Evolution of the cost function during gradient descent with level circles", fontsize=15)
plt.plot(record_x1, record_x2)
plt.plot(record_x1, record_x2, '*', label = "Cost function")
plt.xlabel('x1', fontsize=11)
plt.ylabel('x2', fontsize=11)
plt.colorbar()
plt.legend(loc = "upper right")
plt.show()
GPU 없이 CPU로 돌렸더니 생각보다 너무 오래 걸려서 참조한 깃허브에 기재되어 있는 그래프를 대신 첨부합니다.
**이번에 알게된 사실인데 Visual Studio Code에서 jupyter notebook처럼 코드를 돌리고 결과를 보고싶다면
가장 상단에 #%%를 입력하면 위에 Run Cell | Run Below | Debug Cell 이 뜨면서 코드를 돌릴 수 있습니다
확실히 좀 오래 걸리기는 하지만 매우 유용한 것 같습니다 ㅎㅎㅎ
참고자료:
728x90
반응형
'Data Science > Deep Learning' 카테고리의 다른 글
model.fc.in_features 의미 (0) | 2023.01.23 |
---|---|
OpenAI DALLE2 사용 후기 (Midjourney와 비교) (0) | 2023.01.14 |
1*1 합성곱층 (Convolution layer) 원리 및 목적 설명 (1) | 2022.12.22 |
Residual Block 개념 및 목적 정리 (feat.ResNet)😎 (0) | 2022.12.21 |
CNN 합성곱 신경망 Flatten Layer의 역할 및 방법 (0) | 2022.11.30 |
댓글