3주차-3월 21일
빅데이터분석특강
import tensorflow as tf
import numpy as np
tf.config.experimental.list_physical_devices('GPU')
-
max, min, sum, mean
a= tf.constant([1.0,2.0,3.0,4.0])
a
tf.reduce_mean(a)
-
예제: (2,3,4,5) stack (2,3,4,5) -> (?,?,?,?,?)
a = tf.reshape(tf.constant(range(2*3*4*5)),(2,3,4,5))
b = -a
case1 (1,2,3,4,5) stack (1,2,3,4,5) --> (2,2,3,4,5) # axis=0
tf.stack([a,b],axis=0)
case2 (2,1,3,4,5) stack (2,1,3,4,5) --> (2,2,3,4,5) # axis=1
tf.stack([a,b],axis=1)
case3 (2,3,1,4,5) stack (2,3,1,4,5) --> (2,3,2,4,5) # axis=2
tf.stack([a,b],axis=2)
case4 (2,3,4,1,5) stack (2,3,4,1,5) --> (2,3,4,2,5) # axis=3
tf.stack([a,b],axis=-2)
case5 (2,3,4,5,1) stack (2,3,4,5,1) --> (2,3,4,5,2) # axis=4
tf.stack([a,b],axis=-1)
-
예제: (2,3,4), (2,3,4), (2,3,4)
a= tf.reshape(tf.constant(range(2*3*4)),(2,3,4))
b= -a
c= 2*a
(예시1) (2,3,4), (2,3,4), (2,3,4) $\to$ (6,3,4)
tf.concat([a,b,c],axis=0)
(예시2) (2,3,4), (2,3,4), (2,3,4) $\to$ (2,9,4)
tf.concat([a,b,c],axis=1)
(예시3) (2,3,4), (2,3,4), (2,3,4) $\to$ (2,3,12)
tf.concat([a,b,c],axis=-1)
(예시4) (2,3,4), (2,3,4), (2,3,4) $\to$ (3,2,3,4)
tf.stack([a,b,c],axis=0)
(예시5) (2,3,4), (2,3,4), (2,3,4) $\to$ (2,3,3,4)
tf.stack([a,b,c],axis=1)
(예시6) (2,3,4), (2,3,4), (2,3,4) $\to$ (2,3,3,4)
tf.stack([a,b,c],axis=2)
(예시7) (2,3,4), (2,3,4), (2,3,4) $\to$ (2,3,4,3)
tf.stack([a,b,c],axis=-1)
-
예제: (2,3,4) (4,3,4) $\to$ (6,3,4)
a=tf.reshape(tf.constant(range(2*3*4)),(2,3,4))
b=tf.reshape(-tf.constant(range(4*3*4)),(4,3,4))
tf.concat([a,b],axis=0)
tf.concat([a,b],axis=1)
tf.concat([a,b],axis=2)
-
(2,2) @ (2,) 의 연산?
numpy
np.array([[1,0],[0,1]]) @ np.array([77,-88])
np.array([77,-88]) @ np.array([[1,0],[0,1]])
np.array([[1,0],[0,1]]) @ np.array([77,-88]).reshape(2,1)
np.array([77,-88]).reshape(2,1) @ np.array([[1,0],[0,1]])
np.array([77,-88]).reshape(1,2) @ np.array([[1,0],[0,1]])
tensorflow
I = tf.constant([[1.0,0.0],[0.0,1.0]])
x = tf.constant([77.0,-88.0])
I @ x
x @ I
I @ tf.reshape(x,(2,1))
tf.reshape(x,(1,2)) @ I
-
tf.Variable()로 선언
tf.Variable([1,2,3,4])
tf.Variable([1.0,2.0,3.0,4.0])
-
tf.constant() 선언후 변환
tf.Variable(tf.constant([1,2,3,4]))
-
np 등으로 선언후 변환
tf.Variable(np.array([1,2,3,4]))
type(tf.Variable([1,2,3,4]))
a=tf.Variable([1,2,3,4])
a
a[:2]
a=tf.Variable([1,2,3,4])
b=tf.Variable([-1,-2,-3,-4])
a+b
tf.Variable([1,2])+tf.Variable([3.14,3.14])
import tensorflow.experimental.numpy as tnp
tnp.experimental_enable_numpy_behavior()
-
알아서 형 변환
tf.Variable([1,2])+tf.Variable([3.14,3.14])
-
.reshape 메소드
tf.Variable([1,2,3,4]).reshape(2,2)
-
tf.concat
a= tf.Variable([[1,2],[3,4]])
b= tf.Variable([[-1,-2],[-3,-4]])
tf.concat([a,b],axis=0)
-
tf.stack
a= tf.Variable([[1,2],[3,4]])
b= tf.Variable([[-1,-2],[-3,-4]])
tf.stack([a,b],axis=0)
a= tf.Variable([1,2,3,4])
id(a)
a.assign_add([-1,-2,-3,-4])
id(a)
-
tf.Variable()로 만들어야 하는 뚜렷한 차이는 모르겠음.
-
애써 tf.Variable()로 만들어도 간단한연산을 하면 그 결과는 tf.constant()로 만든 오브젝트와 동일해짐.
-
예제: 컴퓨터를 이용하여 $x=2$에서 $y=3x^2$의 접선의 기울기를 구해보자.
(손풀이)
$$\frac{dy}{dx}=6x$$
이므로 $x=2$를 대입하면 12이다.
(컴퓨터를 이용한 풀이)
단계1
x1=2
y1= 3*x1**2
x2=2+0.000000001
y2= 3*x2**2
(y2-y1)/(x2-x1)
단계2
def f(x):
return(3*x**2)
f(3)
def d(f,x):
return (f(x+0.000000001)-f(x))/0.000000001
d(f,2)
단계3
d(lambda x: 3*x**2 ,2)
d(lambda x: x**2 ,0)
단계4
$$f(x,y)= x^2 +3y$$
def f(x,y):
return(x**2 +3*y)
d(f,(2,3))
-
예제1: $x=2$에서 $y=3x^2$의 도함수값을 구하라.
x=tf.Variable(2.0)
a=tf.constant(3.0)
mytape=tf.GradientTape()
mytape.__enter__() # 기록 시작
y=a*x**2 # y=ax^2 = 3x^2
mytape.__exit__(None,None,None) # 기록 끝
mytape.gradient(y,x) # y를 x로 미분하라.
-
예제2: 조금 다른예제
x=tf.Variable(2.0)
#a=tf.constant(3.0)
mytape=tf.GradientTape()
mytape.__enter__() # 기록 시작
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
mytape.__exit__(None,None,None) # 기록 끝
mytape.gradient(y,x) # y를 x로 미분하라.
$$a=\frac{3}{2}x$$ $$y=ax^2=\frac{3}{2}x^3$$
$$\frac{dy}{dx}=\frac{3}{2} 3x^2$$
3/2*3*4
-
테이프의 개념 ($\star$)
(상황)
우리가 어려운 미분계산을 컴퓨터에게 부탁하는 상황임. (예를들면 $y=3x^2$) 컴퓨터에게 부탁을 하기 위해서는 연습장(=테이프)에 $y=3x^2$이라는 수식을 써서 보여줘야하는데 이때 컴퓨터에게 target이 무엇인지 그리고 무엇으로 미분하고 싶은 것인지를 명시해야함.
(1) mytape = tf.GradientTape()
: tf.GradientTape()는 연습장을 만드는 명령어, 만들어진 연습장을 mytape라고 이름을 붙인다.
(2) mytape.__enter__()
: 만들어진 공책을 연다 (=기록할수 있는 상태로 만든다)
(3) a=x/2*3; y=a*x**2
: 컴퓨터에게 전달할 수식을 쓴다
(4) mytape.__exit__(None,None,None)
: 공책을 닫는다.
(5) mytape.gradient(y,x)
: $y$를 $x$로 미분하라는 메모를 남기고 컴퓨터에게 전달한다.
-
예제3: 연습장을 언제 열고 닫을지 결정하는건 중요하다.
x=tf.Variable(2.0)
a=(x/2)*3 ## a=(3/2)x
mytape=tf.GradientTape()
mytape.__enter__() # 기록 시작
y=a*x**2 ## y=ax^2 = (3/2)x^3
mytape.__exit__(None,None,None) # 기록 끝
mytape.gradient(y,x) # y를 x로 미분하라.
-
예제4: with문과 함께 쓰는 tf.GradientTape()
x=tf.Variable(2.0)
a=(x/2)*3
with tf.GradientTape() as mytape:
## with문 시작
y=a*x**2
## with문 끝
mytape.gradient(y,x) # y를 x로 미분하라.
(문법해설)
아래와 같이 쓴다.
with expression as myname:
## with문 시작: myname.__enter__()
blabla ~
yadiyadi !!
## with문 끝: myname.__exit__()
(1) expression 의 실행결과 오브젝트가 생성, 생성된 오브젝트는 myname라고 이름붙임. 이 오브젝트는 .__enter__()
와 .__exit__()
를 숨겨진 기능으로 포함해야 한다.
(2) with문이 시작되면서 myname.__enter__()
이 실행된다.
(3) 블라블라와 야디야디가 실행된다.
(4) with문이 종료되면서 myname.__exit__()
이 실행된다.
-
예제5: 예제2를 with문과 함께 구현
x=tf.Variable(2.0)
with tf.GradientTape() as mytape:
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
mytape.gradient(y,x) # y를 x로 미분하라.
-
예제6: persistent = True
(관찰1)
x=tf.Variable(2.0)
with tf.GradientTape() as mytape:
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
mytape.gradient(y,x) # 2번이상 실행해서 에러를 관측하라
(관찰2)
x=tf.Variable(2.0)
with tf.GradientTape(persistent=True) as mytape:
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
mytape.gradient(y,x) # 2번이상실행해도 에러가 나지않음
-
예제7: watch
(관찰1)
x=tf.constant(2.0)
with tf.GradientTape(persistent=True) as mytape:
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
print(mytape.gradient(y,x))
(관찰2)
x=tf.constant(2.0)
with tf.GradientTape(persistent=True) as mytape:
mytape.watch(x) # 수동감시
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
print(mytape.gradient(y,x))
(관찰3)
x=tf.Variable(2.0)
with tf.GradientTape(persistent=True,watch_accessed_variables=False) as mytape: # 자동감시 모드 해제
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
print(mytape.gradient(y,x))
(관찰4)
x=tf.Variable(2.0)
with tf.GradientTape(persistent=True,watch_accessed_variables=False) as mytape: # 자동감시 모드 해제
mytape.watch(x)
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
print(mytape.gradient(y,x))
(관찰5)
x=tf.Variable(2.0)
with tf.GradientTape(persistent=True) as mytape:
mytape.watch(x)
a=(x/2)*3 ## a=(3/2)x
y=a*x**2 ## y=ax^2 = (3/2)x^3
print(mytape.gradient(y,x))
-
예제9: 카페예제로 돌아오자.
-
예제10: 카페예제의 매트릭스 버전
-
예제11: 위의 예제에서 이론적인 $\boldsymbol{\beta}$의 최적값을 찾아보고 (즉 $\hat{\boldsymbol{\beta}}$을 찾고) 그곳에서 loss의 미분을 구하라. 구한결과가 $\begin{bmatrix}0 \\ 0 \end{bmatrix}$ 임을 확인하라.