본문 바로가기

IT 로그

이미지 인식의 꽃, CNN 학습 데이터 전처리 과정

728x90
반응형

CNN 데이터 전처리 과정을 정리해보자 ! 

from keras.datasets import mnist # 케라스 이용 mnist 데이터셋 가져오기

MNIST 데이터 셋 : 손글씨 데이터셋 

머신러닝 계의 HELLO WORLD 같은 데이터 셋 

 

출처 : 위키 백과 

데이터 전처리 

케라스를 이용해서 간단히 불러올 수 있다. 

mnist.load_data() 함수로 사용할 데이터를 불러온다 

이때 불러온 이미지 데이터를 X로, 이 이미지에 0~9까지 붙인 이름표를 Y_Class로 구분하여 명명 

- 학습에 사용될 부분 : X_train, Y_class_train 

- 테스트에 사용될 부분 : X_test , Y_class_test 

 

1. 케라스 이용하여 mnist 데이터셋 가져오고 제대로 가져왔는지 확인 

from keras.datasets import mnist # 케라스 이용 mnist 데이터셋 가져오기

(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data() 
#이미지 데이터를 X 로, 이 이미지에 0~9 까지 붙인 이름표를 Y_Class로 명명 
#학습 : train , 테스트 : test

print("학습셋 이미지수 : %d 개 " % (X_train.shape[0]))
print("테스트셋 이미지수 : %d 개 " % (X_test.shape[0]))
# 케라스의 데이터셋에서는 학습셋을  - 60000개 테스트셋을 100000개로 구분해놓았음을 확인할 수 있다

2. 불러온 이미지 데이터를 확인해보자 

#불러온 이미지 중 한개만 가져와보기 
#matplotlib 라이브러리를 사용하고 imgshow를 통해 image를 출력한다.

import matplotlib.pyplot as plt
plt.imshow(X_train[2], cmap= 'Greys')
plt.show()
#cmap = 'Greys' 옵션을 주면 흑백으로 출력하게 된다 .

예제에서는 제일 첫번째 이미지를 가져왔는데 나는 3번째거를 한번 가져와봤다 4라는 손글씨 이미지가 보인다. 

이 이미지는 가로 * 세로 =  28* 28 로 총 784 개의 픽셀로 이뤄져 있고, 
밝기 정도에 따라 0~ 255 의 등급을 매긴다. 

3. 각 픽셀 정보 ( 밝기 정보) 를 픽셀 형식으로 확인해보자 

import sys 
for x in X_train[2]:
  for i in x :
    sys.stdout.write('%d\t' % i)
  sys.stdout.write('\n')

  #sys 모듈은 그냥 import sys로 해주면 끝

요렇게 픽셀로 되어 있는 이미지는 다시 숫자의 집합으로 변해 학습셋으로 사용된다. 

속성을 담은 데이터를 딥러닝에 집어넣고 클래스를 예측한느 문제 ! 

28*28 = 784개의 속성을 이용해 0~9까지 10개 클래스 중 하나를 맞히게 되는 문제가 된다. 

 

4. 딥러닝에 이용하도록 데이터를 바꿔주자 

주어진 28*28 의 이차원 배열을 784개의 1차원 배열로 바꿔보자

이때 사용하는 함수는 reshape() 

reshape 함수 사용법은 reshape (총 샘플 수, 1차원 속성의 수)

#28* 28 2차원 행렬을 784*1 1차원행렬로 바꿔주기 
#reshape 사용 reshape (총 샘플수, 1차원 속성의 수 )
X_train = X_train.reshape(X_train.shape[0], 784)

1차원으로 변경되었다.  

케라스는 데이터가 0~1 사이일때 최적의 성능을 보이므로 0~255로 이루어진 데이터를 0~1로 변경하는 정규화 작업을 해준다. 그러기 위해서 우선 정수형 데이터를 astype() 함수 를 이용해 실수형으로 바꿔준다. 

train , test 데이터 둘 다 적용해주면 된다. 

#케라스는 데이터를 0~1 사이 값으로 변환한 다음 구동할 때 최적의 성능을 보이는 특징이 있다.
#현재 픽셀의 데이터느 0~255까지 값이므로 이를 0~1로 바꿔주어야 한다. 
#데이터의 폭이 클 때 적절한 값으로 분산의 정도를 바꾸는 과정을 데이터 정규화(Data nomalization)
#정규화를 위해 데이터를 실수형으로 바꾼다. (astype 함수 이용)

X_train = X_train.astype('float64')
X_train = X_train / 255 
# 0~255 값을 0~1 사이 값으로 바꾸기 위해 형태를 실수로 바꾸고 가장 큰수 (255)로 나눠서 nomalization을 취해준다
5. 숫자 이미지에 학습된 데이터를 확인해본다. 
print("class: %d" %(Y_class_train[2]))​

class: 4 

숫자의 레이블 값이 제대로 박혀있다. 

6. 원-핫 인코딩 

여러개의 Y 값을 0과 1로만 이루어진 형태로 바꿔주는 기법을 말한다. 

딥러닝의 분류 문제를 해결하기 위해서는 원-핫 인코딩 방식을 이용해야 한다.

즉, 0~9까지의 정수형 값을 가지는 레이블 형태를 0또는 1로만 이루어진 벡터로 값을 수정해야 한다. 

예를 들어 class가 4라면 [0,0,0,1,0,0,0,0,0,0] 로 바꿔줘야 한다.

이 작업을 해주는 함수가 np_utils.to_categorical 이다. 

to_categorical (클래스, 클래스의 개수) 형식으로 지정하여 사용한다. 

 

!pip install np_utils # INSTALL 
from keras import utils

from keras.utils.np_utils import to_categorical

np_utils 를 불러올수 없다는 에러가 나는데 대체 왜일까... ? ㅠㅠ

바이너리부터 문제가 생기니 답답하다.. 

반응형