728x90
Tensorflow는 현존하는 머신러닝 프레임워크 중 가장 유명한 프레임 워크이다.

필자가 딥러닝을 배우기시작하면서 선택한 프레임워크인데 생각보다 어렵지는 않다.


그러나 필자가 블로그에 포스팅 하는 부분들 중에서는 거의 해본적없는 분야이고

빨리 빨리 바뀌기에 이 포스터는 항상 맞을수 없다고 볼 수 있다.

그러기 때문에 읽는 입장에서 그 부분을 고려해서 읽길 바란다.


이 포스터는 Python3.6으로 Tensorflow1.2로 테스팅 했으며 작업환경은 PyCharm이며 특별한 경우가 아니면 쉘에서 실행하지 않음.


지금까지는 변수를 쓰진 않았다. 저번시간의 Feed Dictionary나 Place Holder등은 뭘 의미하는냐라고 물을 수 있다.

저 둘은 변수를 쓰는게 아니다. 왜 변수가 아니냐하면 아직 텐서플로우에 대한 이해가 완벽하지 않기 때문이다.

일단 변수에 대해서 배워보자. 그리고 사용해보면 왜 이의 이름이 변수인지 알 수 있다.


변수 생성


변수의 생성 방법은 아래와 같다.


import tensorflow as tf

a = tf.Variable(12, name='my_variable')
b = tf.constant(7, name='input_b')

c = tf.multiply(a, b, name='mul_c')
d = tf.add(a, b, name='add_d')
e = tf.add(c, d, name='add_e')

init = tf.initialize_all_variables()

sess = tf.Session()

sess.run(init)

print(sess.run(e))


변수는 생성할때 Variable이라는 메소드로 생성한다.

변수는 생성한다고 생성한것이 아니라 반드시 세션단에서 초기화를 시켜줘야한다.

즉 이때까지는 상수들, 혹은 세션이 실행할시 Place Holder로 넣어줬다면,

변수는 만약 사용한다면 초기화를 실행해줘야하며 초기화 코드는 위에서 확인할 수 있다.


init = tensorflow.initialize_all_variables()


이 구문으로 현제 텐서플로우에서 사용하고 있는 모든 변수를 초기화하는 노드를 만들어 준다.

중요한건 이 역시 단순한 노드에 불과하다는 것이다.

노드를 실행해야 효과를 발휘하므로 아래단에서 반드시 노드를 세션에서 실행을 해줘야한다.


less.run(init)


이 코드로 인하여 init노드는 실행이 되므로 모든 변수의 값은 위에서 정한대로 초기화 된다.


변수 초기화


초기화는 여러가지 방법이 있다. 위에서는 initialize_all_variables를 사용해서 모든 변수들을 초기화 했었다.

그런데 부분적인 초기화가 가능하냐고 물을 수 있다. 당연히 가능하다. 아래의 예제를 보자.


import tensorflow as tf

a = tf.Variable(12, name='my_variable_a')
a_ = tf.Variable(24, name='my_variable_as')
b = tf.constant(7, name='input_b')

c = tf.multiply(a, b, name='mul_c')
d = tf.add(a, b, name='add_d')
e = tf.add(c, d, name='add_e')

init = tf.initialize_variables(var_list=[a], name="init_a")

sess = tf.Session()

sess.run(init)

print(sess.run(e))


이 코드의 실행결과 a라는 변수는 초기화 되지만 a_라는 변수는 초기화 되지 않는다.

왜냐하면 부분적으로 선택해서 초기화 하였기 때문이다.


변수 값의 변경


변수의 이름을 변수로 지은 이유는 분명 있을것이다.

이 때까지의 사용은 변수라는 이름에 맞지 않다.

그러면 왜 변수일까? 정말 값이 바뀔 수 있을까 궁금할 것이다.


정말 변수 값은 바뀔 수 있다.

아래의 예제를 보자.


import tensorflow as tf

a = tf.Variable(5, name='my_variable_a')

a = a.assign_add(a)

init = tf.initialize_all_variables()

sess = tf.Session()

sess.run(init)

print(sess.run(a))
print(sess.run(a))


위의 예제를 실행해보자.

그러면 처음 run(a)의 경우 10이, 뒤의 run(a)의 경우 20이 출력됨을 알 수 있다.


a = a.assign_add(a)


위의 코드는 왜 변수라고 부르는지 알려주는 예제인데 이 코드는 쉽게 말해서 a = a+a의 효과를 낸다.

assign_add는 더하라는 뜻이기에 a에 a를 추가해라는 뜻이므로 첫 반복에서 10이된다.

그리고 다시 run(a)를 실행해서 그래프를 재실행할경우 원래 초기값은 5였으나 아까 assign_add의 효과로 a의 값이 10으로 변경되었다.

따라서 다시 실행할 경우 20이 된것이다.


이제 왜 변수인지 알겠는가.

원래 노드 초기값은 그대로 유지가 되는데 변수는 메소드를 사용해서 값을 변경할 경우 초기값 자체가 변경되어서

다음 실행시에는 변환된 숫자가 반환된다. 텐서플로우에서 변수라는 것은 노드의 초기값 자체를 바꿀수 있는 것을 변수라고하는 것이다.

+ Recent posts