텐서플로는 텐서(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 | 주어진 인덱스에 따라 텐서의 원소를 모읍니다. |
·
상수는 값이 고정된 것을 말하며 숫자, 문자를 상수로 선언합니다. 텐서플로에서 변수와 상수를 생성하는 방법은 다음과 같습니다.
함수 | 설명 |
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 에서 확인하기 바랍니다.
심벌릭으로 표현된 수식을 계산하기 위해서 세션을 생성해야 합니다. 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을 생성해 실행하여 출력하는 예제입니다.
변수란 상수와 반대로 값이 변하는 것을 말하며 숫자, 문자, 문장, 파일을 변수의 내용으로 가질 수 있습니다. 변수는 그래프를 최적화하는 용도로 사용되며, 텐서플로우가 학습한 결과를 갱신하기 위해 사용됩니다. 변수를 사용하려면 데이터 그래프를 구성한 후 run() 함수를 실행하기 전에 반드시 초기화해야 합니다. tf.initialize_all_variable()가 변수를 초기화 시킵니다.
비고) tf.initialize_all_variables()를 수행하지 않고 Variable을 수행하면 "FailedPreconditionError: Attempting to use uninitialized value Variable_XX" Error가 발생합니다.
변수의 데이터는 직접 입력도 가능하며, 정규분포처럼 텐서에서 제공하는 함수로도 데이터 입력이 가능합니다. 또한 행렬의 곱을 수행할 때는 꼭 행렬 곱 규칙에 따라 첫 번째 행렬의 열과 두 번째 행렬의 행의 수가 같아야 합니다.
심벌릭 변수 placeholder는 그래프에 사용할 입력값을 나중에 받기 위해 사용되며, 프로그램 실행 중에 데이터를 변경할 수 있습니다. 텐서의 자료형, 구조 및 이름을 매개변수로 설정합니다. feed_dict() 의 매개변수로 전달합니다.
마지막 라인에서 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
[Reference]
텐서플로 첫걸음
[Deep Learning-딥러닝]Backpropagation (역전파) 및 Delta Rule을 이용한 가중치 조정 방법 소스 구현 - XOR 연산 (0) | 2019.08.07 |
---|---|
[Deep Learning-딥러닝]Backpropagation (역전파) 및 Delta Rule을 이용한 가중치 조정 방법 (2) | 2019.08.06 |
[Deep Learning-딥러닝]Solving XOR Problem with MLP (0) | 2019.08.04 |
[Tensorflow]선형회귀분석(Linear Regression) 소스 구현 (0) | 2019.08.03 |
[Tensorflow]Tensorflow 소개 및 설치 방법 (0) | 2019.08.01 |
댓글 영역