9장: Tensorflow 시작하기 (p.295)

https://datascienceschool.net/view-notebook/5cbab09d777841f591a67928d7043f51/

Tensorflow를 잘 소개한 링크

소개 :

머신러닝을 다루는 데에 아주 전문적이고 강력한 오픈소스 소프트웨어 라이브러리로 대규모 데이터를 처리하는 데에 아주 좋다. python 위에서 돌아가며 c++ 코드를 사용해 연산을 수행하여 매우 빠르고 효율적으로 실행한다. Tensorflow의 개념은 계산 그래프 computation graph다.

tensorflow 계산그래프에 대한 이미지 검색결과

여러 CPU, GPU 등을 사용하여 병렬로 처리할 수 있어 분산 컴퓨팅을 지원한다.

 

버전 : python 3.6.8버전 ( 3.7이상은 아직 tensorflow 호환이 안되는 줄 앎)


 

첫 번째 계산 그래프 만들어 세션에서 실행하기

결과 :

 

with 블록 안에서는 with 문에서 선언한 세연이 기본 세션으로 지정된다. 코드를 읽고 쓰기가 수월하고 wiht문이 끝나면 세션은 자동으로 종료된다.

 

각 변수의 초기화를 일일이 하는 대신 위의 함수를 사용할 수 있다. 이 함수는 초기화를 바로 수행하지 않고 계산 그래프가 실행될 때 모든 변수를 초기화할 노드를 생성한다.

일반적으로 tensorflow는 구성단계, 실행단계  > 두 단계로 구성된다.

 

계산그래프 관리

노드를 만들면 자동으로 기본 계산 그래프에 추가된다.

가끔 독립적인 계산 그래프를 만들어야 할 때가 있으면 다음과 같이 사용한다.

 

 

노드 값의 생애주기

세션에서 y를 평가하기 위해 그래프를 실행 하는데 y가 x에 의존, x가 w에 의존하는 것을 감지해서 w를 평가하고 x를 평가한 뒤 y를 평가하여 y를 반환한다. 그 다음 z를 평가하는데 전에 쓰인 그래프를 사용하지 않고 x에 의존, x가 w에 의존하는 것을 다시 계산한다. 즉 모든 노드의 값은 계산 그래프 실행 간에 유지되지 않는다.

변수 값은 예외로 그래프 실행 간에도 세션에 의해 유지된다. 변수는 초기화될 때 일생이 시작되고 세션이 종료될 때까지 남아 있는다.

효율적으로 평가하려면 텐서플로가 한 번의 그래프에서 모두 평가하도록 해야한다.

 

 

텐서플로를 이용한 선형 회귀

 

텐서플로를 사용한 것과 사이킷런에서 선형회귀모델을 사용한 코드를 비교한 결과 거즘 똑같은 것을 볼 수 있다. 하지만 연산속도에 차이가 있다.

 

 

경사 하강법 구현


직접그래디언트 계산

 

 

과정 중 오차역전파를 하기위한 chain rule 계산 그래프:

 

 

자동미분사용

위의 코드예시와 같이 gradient를 수학적으로 유도해야 하는데 매우 번거롭고 실수하기 쉽다. symbolic differentiation을 사용해 자동으로 편미분 방정식을 구할 수 있다. 하지만 결과 코드의 효율이 몹시 나쁠 수 있다.

 

자동으로 gradient를 계산하는 대표적인 4가지 방식

이하 4가지 방식의 이론:

수치미분  구현코드 :

결과 :

전진모드동작미분은 보는 것과 같이 파라미터 개수만큼 그래프를 계산해야하기 때문에 연산횟수가 많다. 드디어 backprobagation 개념에 왔다. chain rule 성질 덕분에 계산이 매우 용이하다. (텐서플로가 사용하는 방식) 이하 gradient를 오차역전파로 구하는 방법은 다른 게시물 참조.

 

 

다양한 자동미분 사용방법

1. 직접 gradient를 구한 것

2. tf.gradients 함수

3. GradientDescentOptimizer는 경사하강기울기(학습률)까지 갖고있는 모듈

4. 모멘텀 기울기 모듈


 

 

 

데이터주입


tf.placeholder 개념 : 값을 받는 컨테이너박스라 생각하자.

텐서플로의 랭크는 배열의 차원을 의미하며 스칼라는 0 벡터는 1 행렬은 2가 된다. linear algebra에서 Rank의 개념과 무관하다.(주의)

tf.placeholder는 Rank가 같아야한다.

 

 

tf.placeholder를 이용한 gradient 구현 (mini batch까지)

 

 

 

모델저장과 복원

훈련시킨 모델의 파라미터  , 또는 훈련 중에 epoch마다의 데이터를 저장할 수 있다.

tf.train.Saver() 함수사용

np.allclose 함수는 두 개매변수로 받은 값이 어떤 아주 작은 값보다 작은 차이 값을 가지면 같은 것으로 간주하고 True를 출력하는 함수다.

저장장소를 지정해 그쪽에 파라미터들을 저장할 수 있다.

저장한 데이터를 부를 수 있다.

 

 

아오 텐서보드는 예전에도 지금도 여전히 안됨 ㅡㅡ(언젠가 하고만다.)

 


이름 범위

앞으로 쓰게 될 신경망처럼 여러 layer를 가지게 될 경우 복잡하게 되어 헷갈리게 된다. 이를 방지하기 위해 tf.name_scope를 사용할 수 있는데, 말 그대로 이름범위를 만들어 관련 있는 노드들을 그룹으로 묶는 것이다.

loss 라는 이름범위로 묶여있는 것을 볼 수 있다.

 

 

모듈화

이름범위로 묶은 것처럼 반복적인 작업은 모듈화로 간단하게 줄일 수 있고 깔끔하게 표현됨으로써 효율을 올릴 수있다.

들어가기전 처음 접한 python 용어:

result = [function(x) for i in range(y)  : 어떤 function(x)를 y번 동안 반복하여 얻어진 결과를 result에 배열로써 저장한다.

 

 

비효율적인 코드 :

반복되는 구문들이 많다. 이를 다음과 같이 줄일 수 있다.

 

좀 더 효율적인 코드 :

tf.add_n 함수는 텐서의 리스트를 받아 합을 계한하는 연산 노드를 만듭니다.

 

더 효율적인 모듈화: (name_scope로 범위묶은 것 뿐)

 

텐서보드 노드에 대한 이미지 검색결과

이처럼 모듈화를 통해 깔끔하게 정리할 수 있다.

 

 


변수 공유

반복되는 작업을 통해 변수가 그래프연산마다 동일하게 쓰이지 않고 다르게 인식되어서 메모리가 낭비되는 일이 발생한다. 이를 막는 효율적인 방법이 tf.variable_scope, tf.get_variable  이있다.

tf.global_variables()를 해보면 threshold 와 b 는 한 번의 변수로 계속 사용됨을 알 수 있다.

 

 

마지막수정 :


References : Hands-On Machine Learning with Scikit Learn & TensorFlow

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다