반응형

/**

날짜 : 2017/1/30

작성자 : 3개월

텐서플로우 상수, 변수, 플레이스 홀더

**/


어떠한 프로그래밍 언어를 배울 때 해당 언어의 자료구조에 대한 이해는 매우 중요하다. 자료를 대상으로 어플리케이션을 만들거나 예측 모델을 만들기 때문이다. 텐서플로우에서의 자료구조는 크게 상수(Constant), 변수(Variable), 심볼릭변수(placeholder)로 나뉜다. 세 종류는 특성이 모두 다르므로 이를 제대로 아는 것이 중요하다. 아래는 텐서플로우에서 이 자료 구조들을 어떻게 생성하고 다루는지 실습한 것이다. 


1. 상수


기본적인 상수 생성 방법 


""" 텐서플로우 상수
    references : 텐서플로우 첫걸음 &
    https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/api_docs/python/constant_op.html
"""
import tensorflow as tf

points = [[1,2,3],[4,5,6]] # 2차원 배열
print(points)

vectors = tf.constant(points) # 텐서플로우 상수 생성

print(vectors) # Tensor("Const_9:0", shape=(2, 3), dtype=int32)
print(vectors.get_shape()) # 2x3

expanded_vectors = tf.expand_dims(vectors, 0) # 2-D 텐서를 3-D 텐서로 차원 확장

print(expanded_vectors) # Tensor("ExpandDims_6:0", shape=(1, 2, 3), dtype=int32)
print(expanded_vectors.get_shape()) # 1x2x3

# value 를 출력하려면 아래와 같이 세션 생성 후 run 해야함
sess = tf.Session()
print(sess.run(vectors)) # [[1 2 3]
                         # [4 5 6]]
print(sess.run(expanded_vectors)) #[[[1 2 3]
                                  # [4 5 6]]]


상수를 생성하는 여러가지 방법


""" 상수를 생성하는 여러가지 방법 """
zeros = tf.zeros_like([4,3,3], dtype=tf.int32, name='zeros')
print(sess.run(zeros)) # [0,0,0] (입력으로 받은 텐서와 같은 shape의 텐서인데 0으로 초기화된 것)

# zeros와 zeros_like의 차이점 잘 비교. 일반적으로 zeros를 많이 쓸거 같음.
zeros2 = tf.zeros([3,4,5], dtype=tf.int32, name='zeros2')
print(sess.run(zeros2)) # 0으로 초기화된 3x4x5 텐서가 만들어짐

ones = tf.ones([2,2,3], dtype=tf.float32)
print(sess.run(ones)) # 1로 초기화된 2x2x3 텐서가 만들어짐

fill = tf.fill([2,3], 9) # 9로 초기화된 2x3 텐서
print(sess.run(fill))

contant = tf.constant([2,3,4]) # 주어진 텐서를 그대로 텐서플로우 변수로 전환
print(sess.run(contant)) # [2 3 4]

tensor = tf.constant(-1.0, shape=[2, 3])# tf.fill([2,3], -1.0) 과 같음
print(sess.run(tensor))


* 난수 상수 생성 -> weight 초기화 할 때 자주 이용


""" 난수 상수 생성 """
# 정규분포 난수
norm = tf.random_normal([2, 3], mean=-1, stddev=4)
print(sess.run(norm))

# 주어진 값들을 shuffle
c = tf.constant([[1, 2], [3, 4], [5, 6]])
shuff = tf.random_shuffle(c)
print(sess.run(shuff))

# 균등분포 난수
unif = tf.random_uniform([2,3], minval=0, maxval=3)
print(sess.run(unif))


시퀀스 상수 생성


""" 시퀀스 """
lin = tf.linspace(10.0, 12.0, 3, name="linspace")
print(sess.run(lin))

# start부터 시작하여 limit까지 (limit는 포함하지 않음) delta의 증가량만큼 확장하며 정수 리스트를 생성합니다.
ran = tf.range(start=3, limit=7, delta=1) 
print(sess.run(ran)) # [3 4 5 6]

# start의 default는 0
ran2 = tf.range(8)
print(sess.run(ran2)) # [0 1 2 3 4 5 6 7]


난수 생성시 Seed의 활용

  • seed를 활용함으로써 매 실행마다 같은 결과를 내도록 할 수 있다.


""" 난수 생성시 seed의 활용 """
a = tf.random_uniform([1], seed=1) # seed를 주고 random한 값을 생성하면 매 session마다 값이 같음
b = tf.random_normal([1])

# Repeatedly running this block with the same graph will generate the same
# sequence of values for 'a', but different sequences of values for 'b'.
print("Session 1")
with tf.Session() as sess1:
  print(sess1.run(a))  # generates 'A1'
  print(sess1.run(a))  # generates 'A2'
  print(sess1.run(b))  # generates 'B1'
  print(sess1.run(b))  # generates 'B2'

print("Session 2")
with tf.Session() as sess2:
  print(sess2.run(a))  # generates 'A1'
  print(sess2.run(a))  # generates 'A2'
  print(sess2.run(b))  # generates 'B3'
  print(sess2.run(b))  # generates 'B4'
    
# tf.set_random_seed를 통해 모든 random value generation function들이 매번 같은 값을 반환함    
tf.set_random_seed(1234)
a = tf.random_uniform([1])
b = tf.random_normal([1])

# Repeatedly running this block with the same graph will generate different
# sequences of 'a' and 'b'.
print("Session 1")
with tf.Session() as sess1:
  print(sess1.run(a))  # generates 'A1'
  print(sess1.run(a))  # generates 'A2'
  print(sess1.run(b))  # generates 'B1'
  print(sess1.run(b))  # generates 'B2'

print("Session 2")
with tf.Session() as sess2:
  print(sess2.run(a))  # generates 'A1'
  print(sess2.run(a))  # generates 'A2'
  print(sess2.run(b))  # generates 'B1'
  print(sess2.run(b))  # generates 'B2'


2. 변수


변수 생성


""" 텐서플로우 변수 
    reference : https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/how_tos/variables/
"""
# 두 변수를 생성.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

# 변수는 반드시 initialization 해야한다.


변수 초기화

  • 변수는 초기화하지 않으면 사용할 수 없다. 반드시 initialization 하여야 한다.


# 변수 초기화

# 두 변수를 생성
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

# 변수 초기화 오퍼레이션을 초기화
init_op = tf.global_variables_initializer()

# 나중에 모델을 실행할때
with tf.Session() as sess:
    sess.run(init_op) # initialization 연산 실행
    print(sess.run(weights))
    print(sess.run(biases))


다른 변수값을 참조하여 변수 초기화


# 다른 변수값을 참조하여 초기화 하기

# 랜덤 값으로 새로운 변수 초기화
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# weights와 같은 값으로 다른 변수 초기화
w2 = tf.Variable(weights.initialized_value(), name="w2")
# weights의 2배 값으로 다른 변수 초기화
w_twice = tf.Variable(weights.initialized_value() * 2.0, name="w_twice")

# 변수 초기화 오퍼레이션을 초기화
init_op = tf.global_variables_initializer()

with tf.Session() as sess : 
    sess.run(init_op)
    print(sess.run(w2))
    print(sess.run(w_twice))



3. 플레이스홀더

실행시에 데이터를 제공하는 방법으로 실제 딥러닝 모델 구축시 많이 쓰인다. sess.run 에서 feed_dict에 dictionary 형식으로 값을 넣어주면 되고 이를 feeding이라 한다.


""" 텐서플로우 심볼릭 변수(플레이스홀더)
"""
a = tf.placeholder("float")
b = tf.placeholder("float")

y = tf.mul(a,b)

sess = tf.Session()

print(sess.run(y, feed_dict={a : 3, b: 5})) # 15.0


반응형