[AI] day2. 텐서플로우 자료형



텐서 자료형



1) 랭크(rank)

텐서의 차원을 표현한다. 변수의 타입에 따라 랭크가 다 다를 수 있다.

Scalar : 크기만 존재하는 값이며 랭크는 0이다.                       ex) s = 1000
Vector : 크기와 방향이 존재하는 값이며 랭크는 1이다.           ex) [1, 2, 3, 4]
Matrix : 행렬. 랭크는 2이다.                                                 ex) [[1,1,1,], [2,2,2], [3,3,3]]
n-Tensor : n차원 숫자 큐브이며 랭크는 n이다.                      ex) 3-Tensor : [[[1],[2],[3]], [[4],[5],[6]]]




2) 셰이프(shape)

각 차원의 크기의 값을 튜플의 형태로 표현한 것이다.

0-D : 랭크가 0이며 [] 로 나타낸다. (스칼라)
1-D : 랭크가 1이며 [D0]로 나타낸다.
2-D : 랭크가 2이며 [D0, D1]로 나타낸다.
3-D : 랭크가 3이며 [D0, D1, D2]로 나타낸다.
4-D : 랭크가 4이며 [D0, D1, D2, D3]로 나타낸다.
따라서 n-D : 랭크가 n이며 [D0, D1, ... ,Dn-1]로 나타낸다.

가령 2-D인 shape에서 [3, 3] 이면 3 x 3 행렬이라는 뜻이다. 셰이프는 constant에서 사용된다. 아래에서 확인해보자.




3) 상수형(constant)

상수를 저장하는 데이터형이다. tf.constant()로 사용된다.

import tensorflow as tf

#tf.constant(value, dtype=None, shape=None, name='Const', verity_shape=False)
# value : 상숫값을 나타낸다.
# dtype : 상수의 데이터형을 나타낸다.
# shape : 차원을 나타낸다.
# name : 상수의 이름을 나타낸다.

test1 = tf.constant([10], dtype = tf.float32)
test2 = tf.constant(10)
test3 = tf.constant(10, dtype = tf.int8)

print(test1)
print(test2)
print(test3)

출력이 test1, test2, test3의 값이 나오는게 아닌 각 테스트의 형태가 출력이 된다. 즉 위의 변수들로 원하는 연산을 해서 출력을 해봤자 그 연산 결과의 형태가 나오지, 구하고자 하는 값이 나오는게 아니다. 가령 a + b + c 연산을 수행하고자 할 때 변수들의 합이 결과로 나오는게 아닌 변수들의 합의 형태가 나오게 된다. 따라서 a + b + c의 값을 구하고 싶으면 session을 사용해야한다.

import tensorflow as tf

x = tf.constant(3)
y = tf.constant(5)
print(x + y)

sess = tf.compat.v1.Session()
res = sess.run(x + y)
print(res)

tensorflow는 데이터를 tensor 형태로 만든 후 연산을 수행하기 때문에 x와 y라는 tensor를 단순히 출력하고자 하면 tensor 자체가 출력이 된다. 따라서 Session을 이용해 session 안에서 연산이 수행이 되도록 만들어 출력해야 연산한 결과 값이 출력이 된다.




4) 변수형(variable)

매개변수 업데이트 및 유지를 위해 사용된다. 메모리에 텐서를 저장하는 버퍼 역할이며, 즉 변수는 텐서가 아닌 객체가 되는 것이다. 선언한 각 변수들은 변수 클래스의 인스턴스가 되는 것이며 초기화를 해주지 않으면 비어 있는 상태가 된다. 따라서 tf.global_variables_initializer() 함수로 초기화를 해주어야한다. tf.Variable()로 사용한다.



import tensorflow as tf

#tf.Variable(<initial_value>, name = <optional_name>)

val_1 = tf.Variable(20)
val_2 = tf.Variable(10)

res = val_1 + val_2

init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)
print(sess.run(res))

session으로 init을 실행시켜 초기화를 한 후, val_1 + val_2 연산을 한 res를 다시 session으로 실행시켜주면 된다.




5) 플레이스홀더(placeholder)

학습용 데이터를 담는 영역으로, 선언 시 초기화가 이루어지는게 아닌 선언 후 그 다음 값을 전달한다. 따라서 반드시 실행 시 데이터가 제공되어야 하며 dtype은 반드시 선언해줘야한다.

import tensorflow as tf

#tf.placeholder(dtype, shape=None, name=None)

val_1 = 1
val_2 = 2

pholder1 = tf.placeholder(dtype=tf.float32)
pholder2 = tf.placeholder(dtype=tf.float32)

sum = pholder1 + pholder2

sess = tf.Session()
res = sess.run(sum, feed_dict={pholder1 : val_1, pholder2 : val_2})

print(res)

feed_dict 라는게 나오는데, 특별한 건 아니고 key와 value를 한쌍으로 갖는 pair의 집합이라고 보면 된다.

댓글