machineLearning

텐서플로우 구조 및 자료형

탄생 2018. 4. 12. 19:00

● 텐서플로우 구조

텐서플로우는 계산식을 정의하고 print를 하면 바로 값이 나오질 않는다 정의된 값은 tensor로만 정의된다

아래와 같이 순서대로 실행하여 텐서플로우가 실행이 된다


1. 텐서 : 계산을 정의

2. 그래프 : 텐서들의 모음

3. 그래프 실행(그래프의 실행은 Session을 통해 이루어 진다.)



● 텐서플로우 자료형

1. 상수형(Constant)

- 상수를 정의한 값

tf.constant(
    value,                      // 상수값
    dtype=None,                 // 상수의 데이터 타입
    shape=None,                 // 상수에 저장되는 차원 - 배열일경우(2,3)
    name='Const',               // 상수의 이름
    verify_shape=False          // 값의 shape을 검증여부
)
 
[Example]
# Constant 1-D Tensor populated with value list.
tensor = tf.constant([1234567]) => [1 2 3 4 5 6 7]
 
# Constant 2-D tensor populated with scalar value -1.
tensor = tf.constant(-1.0, shape=[23]) => [[-1. -1. -1.]
 
                                             [-1. -1. -1.]]

shape을 정의하지 않을경우 자동으로 유추합니다.

2. 플레이스홀더(placeholder)

플레이스홀더는 값을 계산식에 대입하는 변수값이다

tf.placeholder(
    dtype,              // 플레이스홀더에 저장되는 데이터 타입
    shape=None,         // 플레이스홀더에 저장되는 차원
    name=None           // 플레이스홀더의 이름
)
 
[Example]
= tf.placeholder(tf.float32, shape=(10241024))
= tf.matmul(x, x)
 
with tf.Session() as sess:
  print(sess.run(y))  # ERROR: will fail because x was not fed.
  rand_array = np.random.rand(10241024)
 
  print(sess.run(y, feed_dict={x: rand_array}))  # Will succeed.

rand_array 변수에 랜덤한 값을 저장시킨 뒤

feed_dict 명령어를 통해 x는 rand_array를 대입한다고 정의하였다 

이렇게 값을 대입하는 것을 피딩(feeding)이라고 한다


3. 변수(Variable)

상수는 변하지 않은 값을 정의 하고 플레이스홀더는 학습용데이터를 정의한다면

변수는 변하는 값을 정의한다고 생각하면 된다.

모든 변수는 초기화를 해야 사용할수 있다. 

따라서 global_variables_initializer() 함수로 변수를 초기화 해줘야 한다.

tf.Variable.__init__(
    initial_value=None,     // 변수의 초기값
    trainable=True,         // 변수를 그래프 컬렉션에 추가
    collections=None,       // 그래프 콜렉션키의 집합
    validate_shape=True,    // 변수가 알수 없는 모양의 값으로 초기화
    caching_device=None,    // 변수가 캐시되는 위치
    name=None,              // 변수 명
    variable_def=None,      // 
    dtype=None,             // 변수의 데이터 타입
    expected_shape=None,    // 초기값이 있을경우 해당 shape은 이런 모양을 가질것으로 예상
    import_scope=None,      // 
    constraint=None
)
 
[Example]
import tensorflow as tf
= tf.Variable([[1,2,3], [4,5,6], [7,8,9]], dtype=tf.float32)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run(A[:2, :2]))  # => [[1,2], [4,5]]           // 변수의 행렬 2행 2열의 데이터만 선택하여 출력한다
 
  op = A[:2,:2].assign(22. * tf.ones((22)))               // 변수의 행렬 2행 2열의 데이터만 선택하여 변경한다 
                                                               변경은 2행 2열까지 값을 모두 1로 변경한 후 22를 곱한다
  print(sess.run(op))  # => [[22, 22, 3], [22, 22, 6], [7,8,9]]