본문 바로가기
예전글 아카이빙

[TensorFlow 2.0 딥러닝] 챕터01.텐서플로우 이해하기 : #01 텐서플로우? 그리고 텐서?

by DoBeFree 2020. 6. 11.
반응형

※이 글은 텐서플로우 2.0을 기반으로 작성됐습니다.

챕터01.텐서플로우 이해하기 

<목적>
이번 글에서는 텐서플로우가 어떻게 작동하는지 살펴보고, 왜 이런 별난? 구조를 갖게됐는지 신경망구조와 연결해보기위한 첫 단계로 텐서플로우와 텐서에 대해 살펴봅니다.

1. 텐서플로우(TensorFlow)?

텐서플로우(TensorFlow)는 텐서(Tensor)와 "흐르다"의 영어표현인 플로우(Flow)를 합친뜻입니다. "텐서라는것이 흐른다" 라는 모습을 브랜딩화한 이름입니다. 
(따라서 영문이름이 Tensorflow로 소문자로 연결하여 적혀있는 것이 아닌 TensorFlow로 2개의 대문자로 분리돼 있는 즉 2단어로 구별해놓고 있습니다.)

<참고>
"이름에서 알 수 있듯이, 텐서플로는 텐서를 포함한 계산을 정의하고 실행하는 프레임워크입니다. "
- 공식홈페이지 가이드(https://www.tensorflow.org/guide/tensor?hl=ko)

(1) 텐서(Tensor)

그렇다면 텐서(Tensor)라는 것은 무엇일까요? 공식홈페이지에서는 텐서를 아래처럼 설명하고 있습니다.

텐서(tensor)는 벡터와 행렬을 일반화한 것이고 고차원으로 확장 가능합니다. 내부적으로 텐서플로는 기본적으로 제공되는 자료형을 사용해 n-차원 배열로 나타냅니다.
- 공식홈페이지 가이드(https://www.tensorflow.org/guide/tensor?hl=ko)

간단하게 말해 텐서는 텐서플로우가 연산하기 위해 사용하는 자료형, 데이터의 형태라고 생각하면 됩니다. 단지 데이터를 표현하는 방식이 N차원의 Array 형식일 뿐입니다. 우리는 이미 머신러닝을 파이썬으로 구현하면서 N차원 벡터를 통해 데이터를 표현하는 방법에 익숙해 졌고, 모델에 학습시키는 과정에서  데이터프레임을 Numpy Array로 변환하여 사용했었습니다.  단지 그 이름이 Numpy Array에서 텐서로 바뀌었을 뿐입니다.

왜 데이터를 N차원의 벡터, 어레이, 텐서로 나타내는지 한번 살펴보고 넘어가도록 하겠습니다.

참고01.계산할 준비 = 데이터를 수학적으로 정의하기

"고객 데이터" 라는 단어를 들었을때 어떤 모양이 떠오르나요? 사람마다 다르겠지만 보통은 엑셀에서 많이보는 행과 열이 존재하는 테이블 구조를 많이 떠올릴것이라고 생각합니다. 이 테이블에는 고객에 대해 수집한 정보들이 아래처럼 표현되고 있습니다.

근손실0%샵 고객데이터

그 이전에 고객데이터란 무엇일까요?  그리고 데이터란 무엇일까요? 데이터란 어떠한 대상(혹은 현상,관념 등)을 어떤 특성으로 정의한것을 말합니다. 위 예시에서는 고객이라는 대상 5명을 이름, 나이, 성별, 소속그룹명, 구매상품, 구매수량, 총구매금액, 총 7가지 특성으로 정의했고, 따라서 위 테이블은 고객데이터가 됩니다. 

그렇다면 반대로 이 고객 즉 데이터를 어떻게 표현할 수 있을까요?
왼쪽처럼 고객 5명을 5가지 특성 모두로 표현할 수 도 있고, 오른쪽처럼 구매금액, 나이 2가지 특성으로만 설명하고 2차원상의 점으로 고객을 표현할 수도 있습니다. 

이렇게 다양한 방법으로 데이터를 표현할 수도 있습니다. 하지만 우리가 딥러닝을 포함한 머신러닝에서는 데이터를 표현하기 위해 사용하는것이 아닌, 계산하여 수학적 모델을 만들기 위해 사용하는것이기 때문에 그림을 통해서가 아닌 연산을 할 수 있는 형태인 N차원의 배열(Array)로 표현하는 것입니다.
즉 나이와 총구매금액 2가지 특성으로만 고객을 정의한다면 (나이, 총구매금액) 이렇게 2차원의 배열로 표현하여 비니와 효정의 거리를 계산하여 얼마나 둘이 다른지를 계산할 수 있게 되는겁니다. 

3가지 특성을 사용하면 3차원 배열, 4가지 특성을 사용하면 고객5명을 4차원상의 배열로 표현, 즉 N가지 특성으로 데이터를 정의하여 만들면, 수학적으로 데이터를 N차원상의 배열로 표현 할 수 있고 비로소 계산이 가능하게 되기 때문에 때문에 딥러닝을 포함한 머신러닝에서는 데이터를 N차원상의 점으로 표현합니다.

데이터를 표현하는 특성이 늘어날때마다 차원이 증가함

논지를 다시 텐서플로우로 돌려서 즉, 텐서란 텐서플로우에서 우리가 이해하는 데이터를 수학적으로 연산하기 위해 N차원의 배열로 표현한 자료형을 말합니다. 그저 수학적으로 데이터를 표현하고 이름을 낯선 텐서로 지었을뿐 기존 머신러닝과 크게 달라지는점은 없습니다.

(2) 텐서의 구성요소

텐서플로우의 자료형인 텐서는 랭크, 형태, 타입의 3가지 구성요소을 갖습니다. 

1) 랭크(Rank)

앞서 데이터를 수학적으로 표현할 때 설명하는 특성의 숫자에 따라 데이터의 차원이 늘어난다는 점을 설명했습니다. 텐서에서는 이러한 차원은 랭크라고 표현합니다.(RANK) 즉 나이로만 데이터를 정의할 경우 1-Rank 텐서이고, 나이,구매금액,구매상품,구매수량 4가지 특성으로 데이터를 정의한다면 4-Rank 텐서로 표현할 수 있습니다.

tf.Tensor객체의 랭크는 그 차원의 수입니다. 랭크의 동의어는 order또는 degree, n-dimension 입니다. 텐서플로의 랭크는 수학에서 사용하는 행렬의 랭크와는 다릅니다. 다음 표에서 알 수 있는 것처럼, 텐서플로의 각 랭크는 각각 다른 수학 개체(entity)에 해당됩니다.
- 공식홈페이지 가이드(https://www.tensorflow.org/guide/tensor?hl=ko)

실제 데이터를 통해 정리하면 아래와 같이 데이터를 텐서로 표현할 수 있습니다. 

3 # 0-rank tensor : 스칼라를 말합니다.
[1. ,2., 3.] # 1-rank tensor : 1-D(1차원) 벡터와 같습니다. 
[[1., 2., 3.], [4., 5., 6.]] # 2-rank tensor : 2-D(2차원) 벡터 즉 행렬을 말합니다.
[[[1., 2., 3.]], [[7., 8., 9.]]] # 3-rank tensor : 3-D(3차원) 벡터를 의미합니다.
....

 

2) 형태(Shape)

랭크(Rank)가 데이터의 차원을 나타낸다면, 형태는 각랭크차원의 원소개수 즉, 데이터가 몇개로 이루어져있는지 설명합니다.

텐서의 형태(shape)는 각 차원에 있는 원소 개수로 표현됩니다. 텐서플로는 그래프 계산 과정에서 자동으로 텐서 형태를 추론합니다. 이렇게 추론된 형태는 랭크를 알고 있는 경우도 있고 그렇지 않는 경우도 있습니다. 만약에 랭크를 알고 있는 경우라도 각 차원의 원소 개수를 알고 있는 경우도 있고 그렇지 않는 경우도 있습니다.
- 공식홈페이지 가이드(https://www.tensorflow.org/guide/tensor?hl=ko)
3 # 0-Rank Tensor and shape : []
[1. ,2., 3.] # 1-Rank Tensor and shape :  shape [3]
[[1., 2., 3.], [4., 5., 6.]] # 2-Rank Tensor and shape :  shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # 3-Rank Tensor and shape :  shape [2, 1, 3]

 

3) 타입(Type)

타입이란 텐서의 원소가 갖는 값의 형태를 말합하고 아래와 같은 타입을 갖습니다. 전부 다 외울 필요는 없고 있다는 사실만 알아뒀다가 공식 홈페이지(https://www.tensorflow.org/api_docs/python/tf/dtypes?hl=ko)를 참조해 사용하면 됩니다. 

 

이번 글에서는 텐서플로우의 텐서(Tensor)라는 자료형에 대해서 살펴봤습니다. 다음글에서는 Data Flow Graph Computation을 통해 플로우(Flow)의 의미를 이해해보는 시간을 갖을 에정입니다.

 

반응형

댓글