상세 컨텐츠

본문 제목

[Tensorflow]기본 자료구조-텐서(Tensor) - Constant, Variable, Placeholer

Artificial Intelligence

by [성운] 2019. 8. 2. 21:27

본문

자료구조 - Tensor

텐서플로는 텐서(tensor)라는 기본 자료구조로 모든 데이터를 표현합니다. tensorflow에서 다양한 수학식을 계산하기 위한 가장 기본적이고 중요한 자료형입니다. 텐서는 동적 크기를 갖는 다차원 데이터 배열로 볼 수 있으며 Boolean, 문자열 등 자료형을 표현합니다아래는 주요 자료형과 이에 대응하는 파이썬의 자료형을 정리한 표입니다.

텐서플로 자료형 파이썬 자료형 설명
DT_FLOAT tf.float32 32비트 실수
DT_INT16 tf.int16 16비트 정수
DT_INT32 tf.int32 32비트 정수
DT_INT64 tf.int64  64비트 정수
DT_STRING tf.string 문자열 
DT_BOOL tf.bool 불리언

배열에서 1차원 2차원과 같은 개념을 텐서에서는 랭크(rank)라고 표현합니다. Rank값이 0인경우 Scalar, 1인경우는 Vector(1차원또는 행렬(2차원또는 n-Tensor(3차원 이상) 입니다. 랭크가 2인 텐서를 정의하면 아래와 같습니다. (Python에서는 list로 표현됩니다)

텐서-랭크

t0는 랭크가 0인 텐서로 스칼라 값이며, t1은 랭크가 1인 텐서로 벡터로 볼 수 있습니다. t2는 랭크가 2인 텐서로 행렬을 나타낸다고 볼 수 있습니다.

Shape  차원의 요소 개수텐서의 구조를 의미합니다. dtype 해당 텐서의 담긴 요소들의 자료형을 나타냅니다.(string, float, int )

텐서플로 문서에서 텐서의 차원을 표현하기 위해 구조(shape), 랭크(rank), 차원번호(dimension number)라는 명칭을 사용합니다.

구조 랭크 차원번호
[] 0 0-D
[D0] 1 1-D
[D0, D1] 2 2-D
[D0, D1, D2] 3 3-D
....
.... ....
[D0, D1, D2, ... , Dn-1] n n-D

텐서에서 제공하는 함수들에 대해서 알아보겠습니다. 다음 함수를 이용해서 텐서의 정보를 알 수 있으며 변경할 수 있습니다. 아래 표는 텐서에서 제공하는 함수 중 일부를 나열했습니다. (정보를 꾸준히 업데이트 할 예정입니다)

함수 설명
tf.shape 텐서의 구조를 알아냅니다.
tf.size 텐서의 크기를 알아냅니다.
tf.rank 텐서의 랭크를 알아냅니다.
tf.reshape 텐서의 원소는 그대로 유지하면서 텐서의 구조를 바꿉니다.
tf.squeeze 텐서에서 크기가 1인 차원을 삭제합니다.
tf.expand_dims 텐서에 차원을 추가합니다.
tf.slice 텐서의 일부분을 삭제합니다.
tf.split 텐서를 한 차원을 기준으로 여러 개의 텐서로 나눕니다.
tf.tile 한 텐서를 여러 번 중복해서 늘려 새 텐서를 만듭니다.
tf.concat 한 차원을 기준으로 텐서를 이어 붙입니다.
tf.reverse 한 차원을 기준으로 텐서를 역전시킵니다.
tf.transpose 텐서를 전치합니다.
tf.gather 주어진 인덱스에 따라 텐서의 원소를 모읍니다.

·

Constant, Variable, Placeholer

  • Constant

상수는 값이 고정된 것을 말하며 숫자, 문자를 상수로 선언합니다텐서플로에서 변수와 상수를 생성하는 방법은 다음과 같습니다.

함수 설명
tf.zeros_like 모든 원소를 0으로 초기화한 텐서를 생성합니다.
tf.ones_like 모든 원소를 1로 초기화한 텐서를 생성합니다.
tf.fill 주어진 스칼라 값으로 원소를 초기화한 텐서를 생성합니다.
tf.constant 함수 인수로 지정된 값을 이용하여 상수 텐서를 생성합니다.
tf.variable 함수 인수로 지정된 타입으로 변수를 생성합니다.

이 외에도 텐서플로는 변수를 생성할 때 함수 매개변수로 상수나 난수로 생성하는 함수를 제공합니다.

함수 설명
tf.random_normal 정규분포를 따르는 난수로 텐서를 생성합니다.
tf.truncate_normal 정규분포를 따르는 난수로 텐서를 생성하되, 크기가 표준편차의 2배수보다 큰 값은 제거합니다.
tf.random_uniform 균등분포를 따르는 난수로 텐서를 생성합니다.
tf.random_shuffle 첫 번째 차원을 기준으로 텐서의 원소를 섞습니다.
tf.set_random_seed 난수 시드를 설정합니다.

다른 텐서는 https://www.tensorflow.org/guide/tensors 에서 확인하기 바랍니다.

Constant 예제 소스-1

심벌릭으로 표현된 수식을 계산하기 위해서 세션을 생성해야 합니다tf.Session 클래스는 텐서플로우의 오퍼레이션, 즉 노드를 실행하기 위한 클래스입니다Session() 함수를 통해 세션을 생성함으로써 프로그램은 Tensorflow 라이브러리와 연결이 됩니다. , Session 생성하여 run() 메서드를 호출할  심벌릭 코드가 실제 실행됩니다.  print hello num을 수행하니 예상과 다리 자료형이 출력되었습니다.  hello Tensor 자료형이고 type string을 의미합니다. num Tensor 자료형이고 type int을 의미합니다Session을 생성하여 run메서드를 호출해야 실제 실행되며 "Hello TensorFlow" 100을 출력합니다.

다음은 소스는 두 상수 a, b를 선언하고 a b를 더하고 tensorflow session을 생성해 실행하여 출력하는 예제입니다.

Constant 예제 소스-2

 

  • Variable

변수란 상수와 반대로 값이 변하는 것을 말하며 숫자, 문자, 문장파일을 변수의 내용으로 가질 수 있습니다. 변수는 그래프를 최적화하는 용도로 사용되며,  텐서플로우가 학습한 결과를 갱신하기 위해 사용됩니다. 변수를 사용하려면 데이터 그래프를 구성한 후 run() 함수를 실행하기 전에 반드시 초기화해야 합니다. tf.initialize_all_variable()가 변수를 초기화 시킵니다.

비고) tf.initialize_all_variables()를 수행하지 않고 Variable을 수행하면 "FailedPreconditionError: Attempting to use uninitialized value Variable_XX" Error가 발생합니다.

Variable 예제 소스

변수의 데이터는 직접 입력도 가능하며, 정규분포처럼 텐서에서 제공하는 함수로도 데이터 입력이 가능합니다. 또한 행렬의 곱을 수행할 때는 꼭 행렬 곱 규칙에 따라 첫 번째 행렬의 열과 두 번째 행렬의 행의 수가 같아야 합니다.

  • Placeholder

심벌릭 변수 placeholder는 그래프에 사용할 입력값을 나중에 받기 위해 사용되며, 프로그램 실행 중에 데이터를 변경할 수 있습니다. 텐서의 자료형, 구조 및 이름을 매개변수로 설정합니다. feed_dict() 의 매개변수로 전달합니다.

Placeholder 예제 소스

마지막 라인에서 sess.run()을 호출할 때 텐서 a, b 두 개를 feed_dict() 매개변수로 전달하여 데이터를 설정합니다. placeholder()의 세 번째 매개변수를 [None]으로 설정하면 Shape Dynamic으로 설정되며 feed_dict() 정의할 때 데이터 크기를 제약 없이 입력할 수 있습니다.

 

감사합니다.

 

소스는 아래 git에서 받을 수 있습니다.

https://github.com/ynebula/First-Contact-with-Books/blob/master/Tensorflow/Data_Structure.ipynb

 

ynebula/First-Contact-with-Books

첫걸음 시리즈 예제 소스입니다. Contribute to ynebula/First-Contact-with-Books development by creating an account on GitHub.

github.com

[Reference]

텐서플로 첫걸음

https://www.tensorflow.org/guide/tensors

관련글 더보기

댓글 영역