Constant)
이전 예제에서 Constant 로 그래프 세션을 그리고 디바이스로 실행하는 샘플을 보았다.
우선, Constant 는 그 자체로서 그래프 세션이 된다.
( 잘 사용되지는 않음. )
Variable)
뉴럴 네트워크에서 weight 정의시 담아두는 공간으로 주로 사용.
Consant 와 다르게 아래와 같이 Constant 와 동일한 방식으로 Variable 을 실행하면 오류가 나타난다.
var1 = tf.Variable([5])
var2 = tf.Variable([3])
var3 = tf.Variable([2])
var4 = var1 + var2 + var3
sess = tf.Session()
result = sess.run(var4)
print result
오류가 나타나는 이유는 Variable 은 초기화가 필요하기 때문이다.
초기화 함수는 tf.initialize_all_variables() 이다.
즉,
var1 = tf.Variable([5])
var2 = tf.Variable([3])
var3 = tf.Variable([2])
var4 = var1 + var2 + var3
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run( init )
result = sess.run(var4)
print result
여기서
init = tf.initialize_all_variables()
sess.run( init )
는 그래프를 생성하지만 값은 배정되지 않은 상태( 마치 데이타베이스 옵티마이저의 플랜만 떠진 상태) 라고 보면 된다.
이후
result = sess.run(var4)
에서 빈 그래프에 값을 배정해서 디바이스에서 실행하게 된다.
참고로, initialize_all_variables 는 global_variables_initializer 로 변경
Placeholder)
다른 자료형을 매핑해서 텐서로 변경주는 역할.
placeholder 는 그래프를 생성시키지 않는다.
그래서 feeding 이라는 단계가 필요하다.
아래에서
value1 = 5 // 데이타를 만들고
value2 = 3
value3 = 2
ph1 = tf.placeholder( dtype=tf.float32 ) // shape은 선택사항
ph2 = tf.placeholder( dtype=tf.float32 )
ph3 = tf.placeholder( dtype=tf.float32 )
result_value = ph1 * ph2 + ph3 // value 는 없이, 껍데기 placeholder 로 그래프 생성
feed_dict = {ph1: value1, ph2: value2, ph3: value3} // feeding 단계, result_value 는 feed_dict 이전/ 이후 어디에 써도 상관없다. Session 전에만 있으면 됨.
sess = tf.Session()
result = sess.run(result_value, feed_dict=feed_dict)
print (result)
이미지로 트레이닝 샘플)
image = [[1, 2, 3, 4, 5],
[5, 4, 3, 2, 1],
[10, 20, 30, 40, 50] // list 일수도 있고, num file array 일수도 있고...
label = [10, 20, 30, 40, 50]
ph_image = tf.placeholder(dtype=tf.float32)
ph_label = tf.placeholder(dtype=tf.float32)
feed_dict = {ph_image: image, ph_label: label}
result_tensor = ph_image + ph_label
이후 image 에 데이타 불러오는 방법 (opencv, pandas.DataFrame... ) 은 쉽다.
기타)
- True/ Flase, And/Or
tf.Variable([True, True, False, False, True], dtype=bool)
tf.constant([10, 20, 30, 40, 50], dtype=bool)
- tensorflow 의 특징 : 디바이스에 올려서 도는 중에 데이터 매트릭스 모델오류를 발견하는 게 아니라, 돌기전에 데이타 매트릭스 모델을 먼저 체크하고 디바이스에 올려서, 디바이스 올린이후에 오류걱정은 할 필요가 없어진다.