오랜만에 텐서플로우 이야기를 하네요. 뭐 사실 크게 중요하다기 보다는 최근 어떤 자료를 만들다가 이 부분을 추가했는데 그걸 블로그에도 공개하면 좋겠다는 생각이 든것 뿐이랍니다. 오늘은 먼저 Tensorflow의 GradientTape을 이용해서 미분하는 간단한 방법과 또 더 나가서 chain rule을 적용할때 얼마나 편한지도 보여드릴까합니다.
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
일단~ import 하구요~ 어떤아이를 대상으로 하는지
t = np.arange(0, 5, 0.01)
plt.plot(t, (t-1)*(t-4))
plt.grid()
plt.show()
보면~
이렇게 생긴 아이 입니다.~ 이차함수.^^.
x = tf.Variable(2.5)
x라는 변수는 2.5의 값을 넣고 텐서로 선언하구요.
with tf.GradientTape() as tape:
y = (x-1)*(x-4)
그리고 GradientTape을 선언해서 y를 위 그림에 있는 이차함수로 표현해 둡니다. 이렇게 GradientTape을 사용하면 됩니다.
x는 2.5라고 했으니, gradient 함수에 y를 x에 대해 미분한 값(x=2.5지점에서)을 물어보면 0이라고 답이 나옵니다. x=0일때가 꼭지점(약간 유식해 보이는 효과로는 극점)이니까 미분한 값이 0이겠죠~
이제 조금 더 진도를 나가 보도록 하겠습니다. 혹시 미분에서 chain rule이라고 아시나요?
저렇게 x는 2t이고 y는 x의 제곱이라고 하면 저 함수는 합성이 되어서 위 그림처럼 계산할 수 있습니다. 합성이 좀 복잡하면 어렵겠지요. 아무튼 저렇게 함수를 합성할 수 있는데, 미분을 할 때는 꼭 저렇게 합치지 않아도 됩니다.
y를 t에 관해 미분하고 싶다면, dx라는 것을 넣어서 미분 표현식을 확장할 수 있습니다. 이게 chain rule입니다. t가 2일때를 계산하면 저렇게 dx/dt 따로, dy/dx 따로 구한 후 그냥 곱하기만 하면 되는거죠~
t = tf.Variable(2.0)
with tf.GradientTape(persistent=True) as tape:
x = 2*t
y = x**2
x와 y를 위와 같이 표현 할 수 있습니다. 이때 persitent라는 옵션은 GradientTape을 여러번 사용할 수 있도록 합니다.
이렇게 손으로 계산한 것과 같은 결과가 나타나는 것을 알 수 있습니다.^^.
'Theory > DeepLearning' 카테고리의 다른 글
영상 인식에 필요한 기초 기법 간편 정리 - ArUCo Marker, YOLO 등 (2) | 2023.06.19 |
---|---|
Tensorflow로 직접 구현하면서 이해하는 Logistic Regression (2) | 2022.04.27 |
Cost Function 비용함수와 Gradient Descent 경사하강법의 이해 (feat. tensorflow GradientTape) (4) | 2022.03.08 |
어찌어찌 설치하고 구동해본 영상 인식 - CUDA, OpenCV, darknet - YOLO, 그리고 고마운 분들~ (30) | 2018.05.23 |
[Keras] 붓꽃 Iris 데이터 분류해보기 Iris classification using Keras (30) | 2018.05.18 |
Python에서 OpenCV를 통해 내가 손으로 쓴 숫자 영역 확인하기 (42) | 2018.05.08 |
Python에서 OpenCV를 이용해서 초간편하게 사람 얼굴, 몸을 인식하기 (42) | 2018.04.27 |