말랑말랑제리스타일

[딥러닝 입문] 딥러닝 테스트하기 위한 데이터 전처리 과정 본문

프로그래밍/딥러닝

[딥러닝 입문] 딥러닝 테스트하기 위한 데이터 전처리 과정

제리제리 2024. 1. 24. 16:03

지난 글에서 TensorFlow로 딥러닝하는 과정을 설명하고 Reshape 함수를 사용하는 이유와 과정을 설명하기 위해 텐서에 대해 알아봤는데요. 이번에는 마지막으로 카테고리 데이터를 이진 벡터로 변환하는 과정까지 다루면서 딥 러닝 테스트를 위한 데이터 전처리 과정을 마무리해 봅시다.

딥러닝에서 데이터 전처리란?

딥러닝에서 데이터 전처리는 원시 데이터를 딥러닝 모델이 처리할 수 있는 형태로 변환하는 과정을 말합니다.

즉, MNIST 데이터를 딥러닝에 사용할 수 있는 형태로 만들어주는 거죠.

예를 들면 수식 계산을 하기 위해 사과 다섯 개에 배 두 개를 더하면 총 몇 개인지를 수식으로 표현하기 위해서 사과 다섯 개는 5로, 배 두 개면 2로 더하면을 플러스 기호로 바꿔주는 겁니다.

 

딥러닝에서는 MNIST 데이터셋을 이용해 네 개의 데이터를 만들어주는데요.

x_train : 훈련하기 위한 그림 데이터

y_train : 훈련하기 위한 그림 데이터가 각각 어떤 숫자인지를 알려주는 레이블

x_test : 테스트하기 위한 그림 데이터

y_test : 테스트하기 위한 그림 데이터가 각각 어떤 숫자인지를 알려주는 레이블

 

예를 들어 x_train[0]는 이런 그림입니다.

MNIST 데이터셋 x_train의 첫번째 데이터
MNIST 데이터셋 x_train의 첫번째 데이터

그리고 y_train[0]는 5죠.

이런 식으로 x_train과 y_train은 매핑이 되고 x_test 역시 y_test와 매핑이 됩니다.

x_train의 각 픽셀은 0~255 사이의 색상 값으로 되어있고 y_train은 x_train의 각 그림이 어떤 숫자인지 알려주는 레이블이죠.

 

이 그림 데이터와 레이블 데이터를 케라스 모델에 학습시키기 위한 데이터로 만드는 작업을 딥러닝에서 데이터 전처리라고 합니다.

 

딥러닝에서 데이터 전처리 과정

딥러닝에서 데이터 전처리 과정은 정규화, 형태 변환, 레이블 인코딩의 총 3단계로 이루어집니다.

정규화

정규화 과정은 앞서 말한 것과 같이 각 0~255로 되어있는 픽셀 값을 0~1 사이 값으로 변환해 주는 겁니다.

간단히 255로 나누면 0~1 사이의 값이 만들어지겠죠.

예를 들어

[0 128

128 0]

이런 데이터가 있다고 봅시다.

대각선 두 개 픽셀은 검정색이고 나머지 두개 픽셀은 회색이겠죠.

이걸 255로 나누어주면 어떻게 될까요?

[0 0.5

0.5 0]

이렇게 되겠죠.

이렇게 0~1 사이의 값으로 정규화를 시켜주는 단계로 딥러닝 모델의 학습 안정성을 향상하게 됩니다.

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

소스 코드로 표현하면 이런 형태가 됩니다.

x_train /= 255.0
x_test /= 255.0

이렇게 사용해도 결과는 동일한데 데이터 사용 측면에서 상단의 명시적 형 변환이 효율적이라고 하네요.

형태 변환

2D 텐서를 3D 텐서로 변환시켜 주는 형태변환 단계입니다.

MNIST 데이터셋의 모든 데이터는 흑백으로 1개의 채널을 가진 데이터입니다.

즉, 2차원 배열로 값을 표시한다고 보면 되죠.

그러나 딥러닝에 사용되는 컨볼루션 신경망은 3D 텐서 즉, 3차원 배열을 입력으로 받습니다.

그렇기 때문에 2*2 배열을 2*2*1 배열로 바꿔주는 거죠.

데이터 자체는 동일하지만 저장되는 형태가 다르기 때문에 기댓값으로 형태를 바꿔주는 겁니다.

자세한 내용은 이전 글을 참고해 주세요.

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

소스코드 상에는 이렇게 표현이 되겠죠.

여기서 28 두 개는 각 각 이미지의 가로, 세로 크기이며 1은 흑백 사진이기 때문에 채널이 1개라는 의미입니다.

RGB면 3이 되겠죠.

레이블 인코딩

마지막으로 레이블 인코딩 단계입니다.

정규화와 형태 변환에서는 x_train과 x_test 즉, 이미지를 직접 수정했다면 레이블 인코딩은 y_train과 y_test 레이블을 인코딩해줍니다.

말이 인코딩이지 별거 없습니다.

[5 0 4 ... 5 6 8]

최초에 이런 형태로 y_train에 정보가 들어가게 되는데요.

[[0. 0. 0. ... 0. 0. 0.]
 [1. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 1. 0.]]

이런 형태로 바꿔주는 거죠. 2차원으로 차원을 한 단계 늘려주고 해당 레이블에 맞는 숫자를 1로 아닌 숫자를 0으로 바꿔서 배열화해 주는 겁니다.

즉, 5는 0이 첫 번째 데이터라고 할 때 6번째 데이터죠.

[0 0 0 0 0 1 0 0 0]

이렇게 바꿔주는 겁니다.

8 같은 경우 아래와 같이 되겠죠.

[0 0 0 0 0 0 0 1 0]

이걸 소스 코드 두 줄로 나타내면 이렇습니다.

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

여기서 10은 총 0부터 9까지 10가지 레이블을 이진 데이터화 인코딩 시켜준다는 의미가 됩니다.

여기까지 딥러닝의 모델 전처리 단계였는데요.

각 잡고 알아보니까 일단 전처리까지는 어떻게 이해가 된 것 같습니다.

부디 이 글을 읽은 분들도 다들 잘 이해하셨길 바라면서 다음 챕터에서는 딥러닝 모델 정의 단계로 가보겠습니다.

반응형
Comments