Onik Lab.

딥러닝 신경망 - (2) 딥러닝 데이터 표현

February 10, 2020 | 3 Minute Read • 0 Comments

이번 글은 딥러닝 연구를 위한 신경망 두 번째 글인 딥러닝 데이터 표현에 대해서 다루도록 하겠습니다.

기본적인 자료는 프랑소와 솔레가 저술한 ‘케라스 창시자에게 배우는 딥러닝(길벗)’ 서적의 내용을 토대로 따왔으며, 제가 직접 그린 이미지도 있지만 책의 이미지도 일부 따왔음을 먼저 알려드립니다. 이번 글은 상기 서적의 2장을 다루었으나, 책의 내용을 참고하여 제 기준에서 나름대로 정리한 내용입니다. 너무 많은 내용을 자세히 설명하면 저작권에 문제가 될 소지가 있으므로 구체적으로는 다루지 않고 대략적으로만 다루니 양해 바랍니다.

본문에 있는 코드 중 일부는 해당 책의 코드이고, 일부는 제가 임의로 작성한 코드이니 역시 참고 바랍니다.

케라스 창시자에게 배우는 딥러닝 서적 클릭

데이터 표현

신경망 데이터를 표현하는 방법은 여러 가지가 있습니다. NumPy 배열을 예로 해서 하나씩 소개하겠습니다.

스칼라(0D Tensor)

숫자 하나만 가지고 있는 값을 뜻합니다.

a = np.array(10)
벡터(1D Tensor)

숫자의 배열을 나타내며, 하나의 축에 여러 개의 값으로 나타냅니다..

a = np.array([10, 20, 30, 100])
행렬(2D Tensor)

열(Column)과 행(Row)로 구성된 배열로 볼 수 있겠죠.

x = np.array([0, 1, 2, 3])
y = np.array([10, 20, 30, 100])

Vector

그러면 위와 같이 나타나는 것을 확인할 수 있습니다.

텐서(3D or Upper Tensor)

3D 부터는 텐서(Tensor)라고 표현을 합니다. 그래서 3D 텐서, 4D 텐서, 5D 텐서 등등이 있습니다.

  • 흑백 이미지를 다룰 때는 3D 또는 4D 텐서를 사용하고
  • 컬러 이미지를 다룰 때는 4D 텐서를 사용하고
  • 동영상을 다룰 때는 5D 텐서를 사용합니다.

왜 그럴까요?

일단 이미지나 동영상은 기본적으로 좌표라는게 있습니다. 앞서 말한 행렬의 x축과 y축. 다음은 흑백 이미지의 경우에는 흑백을 나타내는 코드라는게 있겠죠.

그래서 28x28 이미지 중 (10, 15) 좌표에서

  • 검은색을 다루겠다 한다면 (10, 15, 0)이 될테고,
  • 흰색을 다루겠다 한다면 (10, 15, 255) 이런 식으로 되겠죠.

컬러 이미지의 경우라면? 컴퓨터에서 표현할 수 있는 컬러는 RGB 형태입니다. HSB나 CMYK같은 컬러도 있지만, 이 색상 유형은 사실 사람들이 사용하는 색상이지 컴퓨터가 사용하는 색상은 아닙니다. 그렇기 때문에 이들 컬러도 결국은 RGB로 변환됩니다.

그래서 만약에 (10, 15) 좌표에 빨간색을 나타내겠다 한다면 아래와 같은 예제의 형태가 되겠죠.

  • (10, 15, 0, 255), (10, 15, 1, 0), (10, 15, 2, 0)

빨간색 색상코드는 RGB (255, 255, 0)입니다. 그래서 Red에 대한 3차원 값은 0, Green에 대한 3차원 값은 1, Blue에 대한 3차원 값은 2. 그러면 위 코드가 의미하는 것이 이해가 되실 것입니다.

그렇다면 동영상은 매우 설명이 쉬워집니다. 동영상은 기본적으로 프레임으로 구성되기 때문에 각 프레임 별 이미지를 연속해서 나타낸게 동영상이거든요.

(10, 15)좌표에 빨간색을 나타내는데 그게 알고보니까 17번 프레임이였다?

  • (17, 10, 15, 0, 255), (17, 10, 15, 1, 0), (17, 10, 15, 2, 0)

이 때는 프레임-x축-y축-색상형태-색상코드 이 순서가 되겠죠.

MNIST 모델의 표현

앞서서 딥러닝에 대한 기본 예제 모델로는 MNIST 모델을 사용한다 했습니다. 사실 MNIST의 훈련 데이터 모델은 6만개가 있어요. 그렇다면 그 중에 아무거나 한 개 집어서 출력을 하면 어떻게 될까요.

from matplotlib import pyplot as plt
import numpy as np
from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
rnd = np.random.randint(60000)

plt.imshow(train_images[rnd])
plt.show()

IMSHOW

이런 식으로 나타나겠죠.

사실 책에 있는 것을 다 베껴올 수는 없습니다. 그러고 싶지도 않고요. 단지 제가 책을 통해서 어떤 식으로 이해했는가. 그리고 필요한 내용이 무엇이고 전달하려고 하는 내용이 무엇인가에만 초점을 두고 쓴 것입니다.

이번 글은 여기서 마치고, 다음 글은 딥러닝 프로세스에 기반해서 신경망 연산을 어떻게 하는 지를 다루겠습니다.