- 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)
다음은 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 을 실제 호출 가능한 함수로 만들 때 사용
이렇게 하면, 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에서 다음과 같음
------
theano 는 function 이외에는 실제로 계산이 전혀 일어나지 않는다.
tensor로 선언한 심볼릭 변수와 shared에 올린 심볼릭 메모리 변수나 전부다 수식, 즉 expression 만 연결하는 것이고, 이에 대한 실제 모든 계산은 function을 실행시켜야 일어난다.
이는 GPU에서 모든 계산을 돌리는 최적화와 심볼릭한 방식으로 코딩을 할 수 있다는 이점이 크다.
'Development > for Machine Learning' 카테고리의 다른 글
빅데이터 플랫폼 (0) | 2015.04.13 |
---|---|
Practical Theano Tutorial (0) | 2015.03.11 |
CUDA Programming (2) | 2014.11.17 |
CUDA / CuDNN / Theano / TensorFlow 설치하기 (4) | 2014.07.07 |
Weka (0) | 2014.06.23 |
댓글