- Theano 에서 심볼릭 변수 print하기

단, 반드시 최종 theano.function을 하는 computation graph에 해당 변수가 포함되어있어야 만 함.

# this is the optimal solution for the checking the real shape
outputs = Print(' outputs shape: ', attrs=['shape'])(outputs) 

http://deeplearning.net/software/theano/library/printing.html

아래의 것들은 최적화가 아닌 여러 방법들.

#print (outputs.get_value(borrow=True, return_internal_type=True).shape) # get_value is exist in sharedVariable, not symbolicVariable

#print (outputs.shape.eval()) # it is possible when out of theano function. i think.

#debugprint(outputs, depth=1) # it is used for print computational graph

#outputs = Print(' outputs shape: ')(outputs.shape) # it is possible, but the outputs = outputs.shape








- Theano flag 사용법

1) theano를 호출할 때 매번 flag를 지정한다.
ex) THEANO_FLAGS='floatX=float32,device=gpu0,nvcc.fastmath=True' python <myscript>.py

2) vim 으로 홈폴더에있는 .theanorc 파일을 수정한다.(강력 추천)
ex) 

[global]
floatX = float32
device = gpu0

[nvcc]
fastmath = True

다음은 flag 목록이다.

http://deeplearning.net/software/theano/library/config.html#libdoc-config


- Theano introduction

http://deeplearning.net/software/theano/introduction.html#introduction


생각보다 symbolic expression 이 개발 및 최적화에 큰 영향을 미치는 것으로 보인다.

또한 생각보다 GPU 최적화가 잘되어 있는 것 같다.

https://github.com/soumith/convnet-benchmarks

위의 벤치마크 결과 theano가 가장 우수하다.

파이썬코드를 c로바꾼다음 nvcc로 컴파일하기에 c의 속도를 낼 수 있다.


개발상의 추상화도 굉장히 잘되어 있는 것 같다.


theano.function : 사용자가 정의한 symbolic expression 을 실제 호출 가능한 함수로 만들 때 사용

f = function([x, y], z)

이렇게 하면, x,y가 인풋이고 z를 아웃풋? 수식? 으로하는 함수가 생성됨.


Shared Variable : 

A Variable whose value may be shared between multiple functions. See shared and theano.function.

x = T.iscalar('x') : i는 int를 뜻하며, int로된 스칼라 x 심볼릭 변수를 할당한 것임.

dscalar는 double을 의미.


Variable은 값을 가지고 있지 않는 식에서의 변수를 의미함.

SharedVariable은 실제로 값을 가지고 있으면서, Variable 과 연산이 가능한 즉, function에서 접근이 가능한 변수임

z = theano.shared(value=0.,name="z")

그래서 shared의 값을 가져올 때는 변수명.get_value()로 가져와야함

sharedvariable은 파이썬 자체 변수와는 다른 것임.


function은 결국 실제로는 shared variable의 값만 건드릴 수 있음

그리고 function에 넣는 파라미터로는 shared variable을 집어넣으면 안됨. variable만들어갈 수 있음.


shared variable 에서 borrow=True 는 shallow copy를 허락하는 것을 의미하며, 이를 사용하면 더 속도가 빠르다고 한다. 그러나 위험한 경우가 있는 것같음.


tensor.dot() : 행렬 또는 vector 의 내적(inner product)를 의미한다.

y.shape[0] : y행렬의 row 크기를 나타낸다.

y.shape[1] : y행렬의 column 크기를 나타낸다.



function 까지 안쓰고, 손쉽게 값을 찍어보려면 t.eval()


arange는 0부터n-1까지 숫자를 담은 배열을 만드는 거


이런식의 numpy오퍼레이션은 theano에서 다음과 같음

>>> n = np.arange(9).reshape(3,3)
>>> n[n > 4]
array([5, 6, 7, 8])


t = theano.tensor.arange(9).reshape((3,3))
t[(t > 4).nonzero()].eval()


------

theano 는 function 이외에는 실제로 계산이 전혀 일어나지 않는다.

tensor로 선언한 심볼릭 변수와 shared에 올린 심볼릭 메모리 변수나 전부다 수식, 즉 expression 만 연결하는 것이고, 이에 대한 실제 모든 계산은 function을 실행시켜야 일어난다.

이는 GPU에서 모든 계산을 돌리는 최적화와 심볼릭한 방식으로 코딩을 할 수 있다는 이점이 크다.


by 곽동현 이스텔리앙 2015. 1. 20. 17:06