MLOps 프로젝트/도서 '케라스 창시자에게 배우는 딥러닝'

1부 2.2 신경망을 위한 데이터 표현

youjin86 2021. 8. 23. 19:36

1부 딥러닝의 기초

2장 딥러닝이란 무엇인가?


2.2 신경망을 위한 데이터 표현

최근 모든 머신 러닝 시스템은 일반적으로 텐서를 기본 데이터 구조로 사용

 

텐서(tensor)

머신 러닝의 기본 구성 요소

데이터를 위한 컨테이너(container)

거의 항상 수치형 데이터를 다루므로 숫자를 위한 컨테이너

임의의 차원 개수를 가지는 행렬의 일반화된 모습 (텐서에서는 차원(dimension)을 종종 (axis)이라고 부름.)

 

스칼라(0차원 텐서, 0D 텐서)

하나의 숫자만 담고 있는 텐서

넘파이에서는 float32나 float64 타입의 숫자가 스칼라 텐서

ndim 속성을 사용하면 넘파이 배열의 축 개수를 확인할 수 있음.

 

import numpy as np
x=np.array(12)
x.ndim

축 개수(랭크, rank) = 0

 

벡터(1D 텐서)

숫자의 배열

딱 하나의 축을 가짐.

 

import numpy as np

#5개의 원소를 가진 5차원 벡터(5D 벡터)
x=np.array([1,2,3,4,5])
x.ndim

축 개수(랭크, rank) = 1

 

5D 벡터와 5D 텐서의 차이

5D 벡터 : 하나의 축을 따라 5개의 차원을 가진 것

5D 텐서 : 5개의 축을 가진 것

 

행렬(2D 텐서)

벡터의 배열

행(row)과 열(column)인 2개의 축 존재

 

행(row)

첫 번째 축에 놓여 있는 원소

열(column)

두 번째 축에 놓여 있는 원소

import numpy as np

# 첫 번째 행 : [5, 78, 2, 34, 0]
# 첫 번째 열 : [5, 6, 7]

x = np.array([[5, 78, 2, 34, 0], 
             [6, 79, 3, 35, 1], 
             [7, 80, 4, 36, 2]])
          
x.ndim

축 개수(랭크, rank) = 2

 

3D 텐서와 고차원 텐서

행렬들을 하나의 새로운 배열로 합치면 숫자가 채워진 직육면체 형태

import numpy as np

x = np.array([[[5, 78, 2, 34, 0], 
              [6, 79, 3, 35, 1], 
              [7, 80, 4, 36, 2]], 
             [[5, 78, 2, 34, 0], 
              [6, 79, 3, 35, 1], 
              [7, 80, 4, 36, 2]], 
             [[5, 78, 2, 34, 0], 
              [6, 79, 3, 35, 1], 
              [7, 80, 4, 36, 2]]])

x.ndim

축 개수(랭크, rank) = 3

 

 

4D 텐서

3D 텐서들을 하나의 배열로 합친 텐서

축 개수(랭크, rank) = 4

 

딥러닝에서는 보통 0D에서 4D까지의 텐서를 다루며, 동영상 데이터를 다룰 경우에는 5D 텐서까지 사용하기도 함.

 

텐서의 3개 핵심 속성

축의 개수(랭크, rank)

예를 들어 3D 텐서에는 3개의 축이 있고, 행렬에는 2개의 축이 있음.

넘파이 라이브러리에서는 ndim 속성에 저장

 

크기(shape)

텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타낸 파이썬의 튜플(tuple)

 

[예]

  • 앞에 나온 행렬의 크기는 (3, 5)
  • 3D 텐서의 크기는 (3, 3, 5)
  • 벡터의 크기는 (5,)처럼 1개의 원소로 이루어진 튜플
  • 배열 스칼라는 ()처럼 크기가 없음.

데이터 타입(dtype)

텐서에 포함된 데이터의 타입

[예]

float32, uint8, float64 등 (드물게 char 타입 사용)

텐서는 사전에 할당되어 연속된 메모리에 저장되어야 하므로 넘파이 배열은 (그리고 대부분 다른 라이브러리는) 가변 길이의 문자열을 지원하지 않음.

 

배치 데이터

샘플 축(sample axis) == 샘플 차원(sample dimension)

일반적으로 딥러닝에서 사용하는 모든 데이터 텐서의 첫 번째 축(인덱스가 0부터 시작하므로 0번째 축)

MNIST 예제에서는 숫자 이미지가 샘플

 

딥러닝 모델은 한 번에 전체 데이터셋을 처리하지 않고 데이터를 작은 배치(batch)로 나눔.

 

배치 축(batch axis) == 배치 차원(batch dimension)

배치 데이터를 다룰  첫 번째 축(0번 축)

 

텐서의 실제 사례

벡터 데이터

(samples, features) 크기의 2D 텐서

 

시계열 데이터 또는 시퀀스(sequence) 데이터

(samples, timesteps, features) 크기의 3D 텐서

 

이미지

(samples, height, width, channels) 또는 (samples, channels, height, width) 크기의 4D 텐서

 

동영상

(samples, frames, height, width, channels) 또는 (samples, frames, channels, height, width) 크기의 5D 텐서

 

벡터 데이터

대부분의 경우에 해당

첫 번째 축은 샘플 축(sample axis)이고, 두 번째 축은 특성 축(feature axis)

 

[예]

  • 사람의 나이, 우편 번호, 소득으로 구성된 인구 통계 데이터. 각 사람은 3개의 값을 가진 벡터로 구성되고 10만 명이 포함된 전체 데이터셋은 (100000, 3) 크기의 텐서에 저장될 수 있음.
  • (공통 단어 2만 개로 만든 사전에서) 각 단어가 등장한 횟수로 표현된 텍스트 문서 데이터셋. 각 문서는 2만 개의 원소(사전에 있는 단어마다 하나의 원소에 대응합니다)를 가진 벡터로 인코딩될 수 있음.
  • 500개의 문서로 이루어진 전체 데이터셋은 (500, 20000) 크기의 텐서로 저장됨.

 

시계열 데이터 또는 시퀀스 데이터

데이터에서 시간이 (또는 연속된 순서가) 중요할 때는 시간 축을 포함하여 3D 텐서로 저장

관례적으로 시간 축은 항상 두 번째 축(인덱스가 1인 축)

 

[예]

  • 주식 가격 데이터셋
    1분마다 현재 주식 가격, 지난 1분 동안에 최고 가격과 최소 가격을 저장
    1분마다 데이터는 3D 벡터로 인코딩되고 하루 동안의 거래는 (390, 3) 크기의 2D 텐서로 인코딩됨. (하루의 거래 시간은 390분).
    250일치의 데이터는 (250, 390, 3) 크기의 3D 텐서로 저장될 수 있음.
    여기에서 1일치 데이터가 하나의 샘플이 됨.
  • 트윗 데이터셋
    각 트윗은 128개의 알파벳으로 구성된 280개의 문자 시퀀스
    여기에서는 각 문자가 128개의 크기인 이진 벡터로 인코딩될 수 있음.(해당 문자의 인덱스만 1이고 나머지는 모두 0인 벡터)
    그러면 각 트윗은 (280, 128) 크기의 2D 텐서로 인코딩될 수 있음.
    100만 개의 트윗으로 구성된 데이터셋은 (1000000, 280, 128) 크기의 텐서에 저장

 

이미지 데이터

이미지는 전형적으로 높이, 너비, 컬러 채널의 3차원으로 이루어짐

 

[이미지 텐서의 크기를 지정하는 방식]

1. 채널 마지막(channel-last) 방식

텐서플로에서 사용

(samples, height, width, color_depth)처럼 컬러 채널의 깊이를 끝에 놓음.

 

2. 채널 우선(channel-first)방식

씨아노에서 사용

(samples, color_depth, height, width)처럼 컬러 채널의 깊이를 배치 축 바로 뒤에 놓음.

 

케라스 프레임워크는 두 형식을 모두 지원

 

비디오 데이터

비디오 데이터는 현실에서 5D 텐서가 필요한 몇 안 되는 데이터 중 하나

하나의 비디오는 프레임의 연속이고 각 프레임은 하나의 컬러 이미지

프레임이 (height, width, color_depth)3D 텐서로 저장될 수 있기 때문에 프레임의 연속은 (frames, height, width, color_depth)4D 텐서로 저장될 수 있음.

여러 비디오의 배치는 (samples, frames, height, width, color_depth)5D 텐서로 저장될 수 있음.