반응형
/**
날짜 : 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
반응형
'Tools > Tensorflow' 카테고리의 다른 글
텐서플로우 2019 Dev summit 텐서플로우 2.0 발표 리뷰 (1) | 2019.03.27 |
---|---|
Tensorflow GPU 버전의 설치 (Jan. 2019) (0) | 2019.01.13 |
Tensorflow - MNIST 단일 계층 신경망 트레이닝 (6) | 2017.02.01 |