News & Events
안녕하세요
이번에는 변수에 대해서 알아보도록 하겠습니다.
1.변수 생성
Tensorflow에서는 Variable() 이라는 생성자를 사용해서 변수를 생성할 수 있습니다.
이 변수는 생성되는 순간에 데이터의 타입과 크기가 결정이 됩니다.
아래와 같이 2.0의 실수 값을 생성하고 그 즉시 print를 해보면 object의 형태로만 보여지고 값이 출력이 되지 않습니다.
또, 이 변수들은 상수와는 다르게 특별히 초기화를 해주어야 합니다.
tf.initialize_all_variables() 라는 op을 이용해서 위에 정의된 모든 변수들을 초기화하며 이를 수행하지 않고 실행을 하면 에러가 발생하게 됩니다.
그리고 이렇게 초기화된 변수들은 session에서 한번 실행을 해주어야 실제로 사용이 가능해지고,
sess.run(x)를 통해서 x 값을 출력하면 정상적으로 2.0의 값이 출력이 되는 것을 볼 수 있습니다.
import tensorflow as tf
x = tf.Variable( 2. )
print(x)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
print(sess.run(x))
> <tensorflow.python.ops.variables.Variable object at 0x7fa6676d0d50>
> 2.0
2. 변수 초기화
이렇게 생성된 변수 x는 연산과 같은 op에서 자유롭게 사용이 가능하며 또는, 또 다른 변수 y를 초기화 하는데 사용이 될 수도 있습니다.
아래와 같이 y 변수를 생성할 때 x의 값을 사용해서 초기값을 셋팅하는 것이 가능합니다. x.initialized_value()
import tensorflow as tf
x = tf.Variable( 2. )
y = tf.Variable(x.initialized_value() + 3.)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
print(sess.run(y))
> 5.0
3. 랜덤 데이터 생성
x 변수를 784 x 200 Matrix로 생성을 해보겠습니다. tf.random_normal()을 이용해서 한번에 쉽게 랜덤한 데이터를 만들어 낼 수 있습니다.
y 를 출력하면 아래 결과와 같이 실수형 데이터들이 보여집니다. 너무 많아서 … 으로 축약되어 보여지네요
784개의 행과 200개의 열의 데이터가 생성이 되었습니다.
마지막에 y.get_shape()를 통해서 y 변수가 가지고 있는 크기 정보를 확인할 수도 있습니다.
import tensorflow as tf
x = tf.Variable(tf.random_normal([784, 200], stddev=0.35))
y = tf.Variable(x.initialized_value() + 3.)
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
print(sess.run(y))
print(y.get_shape())
> [[ 3.02768564 3.12597466 2.52994156 …, 3.08230495 2.91772604
3.7224791 ]
[ 3.2493639 3.8909955 2.63857961 …, 3.07862258 2.58424544
3.00868273]
[ 3.27517128 3.07848358 2.64484692 …, 2.46941996 4.09747887
2.73206043]
…,
[ 3.03197098 3.48627377 3.41118765 …, 2.15849185 3.02953553
3.33804893]
[ 3.68876958 2.74948573 3.08964419 …, 2.69333315 3.03848982
3.31442404]
[ 2.91405964 2.7167685 2.59313202 …, 3.64224887 2.87397122
3.16949797]]
> (784, 200)
4. 데이터 파일로 저장
이렇게 생성되고 사용되어진 변수들은 파일로 저장하거나 불러와서 재사용할 수도 있습니다.
Tensorflow에서는 이러한 기능을 saver 라는 op을 통해서 제공하고 있습니다.
아래와 같이 tf.train.Saver() op을 통해서 /tmp/model.ckpt 파일로 저장을 하면 됩니다.
실제 서버로 ftp나 ssh으로 접속해서 tmp 폴더 아래에 해당 파일이 생성이 되었는지 확인을 해보면 정상적으로 파일을 볼 수 있습니다.
import tensorflow as tf
x = tf.Variable(tf.random_normal([784, 200], stddev=0.35))
y = tf.Variable(x.initialized_value() + 3.)
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
sess = tf.Session()
sess.run(init_op)
save_path = saver.save(sess, "/tmp/model.ckpt")
5. 파일로 부터 데이터 로드
그럼 이번에는 저장된 파일로 부터 데이터를 다시 불러오는 것을 해보겠습니다.
동일하게 tf.train.Saver()를 이용해서 restore를 하면 위에서 저장했던 파일로 부터 데이터를 불러와 다시 사용할 수 있습니다.
출력을 해보면 랜덤이 아닌 저장할 때의 동일한 데이터 값이 계속 출력되는 것을 확인할 수 있습니다.
import tensorflow as tf
x = tf.Variable(tf.random_normal([784, 200], stddev=0.35))
y = tf.Variable(x.initialized_value() + 3.)
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
sess = tf.Session()
sess.run(init_op)
saver.restore(sess, "/tmp/model.ckpt")
print(sess.run(x))
>[[-0.00422456 0.0978028 0.31975791 …, 0.1045675 0.16592446
0.20451532]
[-0.39301658 -0.2137443 0.16733795 …, -0.10631239 -0.1307248 -0.399003 ]
[ 0.26005134 0.40481696 -0.09874729 …, 0.07433771 0.56824595
-0.32252845]
…,
[ 0.42993194 -0.01891601 0.11422288 …, -0.17722437 0.13874942
-0.26585674]
[ 0.29745746 -0.63581216 0.74154449 …, -0.21865241 -0.2302119
-0.11292892]
[ 0.00222778 0.0909359 0.06996936 …, -0.33092076 -0.35708269
-0.27993494]]