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라는 손글씨 이미지가 보인다.
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을 취해준다
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 를 불러올수 없다는 에러가 나는데 대체 왜일까... ? ㅠㅠ
바이너리부터 문제가 생기니 답답하다..
'IT 로그' 카테고리의 다른 글
예비 또는 현직 it 종사자 주목 ! 2022년 1월 IT 관련 세미나 일정 (8) | 2022.01.17 |
---|---|
티스토리 단축기 이용해보기 (8) | 2022.01.04 |
파이썬 머신 러닝 완벽 가이드 - 추천 시스템 - 행렬 분해의 이해 (2) | 2021.12.27 |
잠재요인 협업 필터링의 원리를 정리해보자 (0) | 2021.12.24 |
추천시스템 공부(1) 협업필터링 - 절대 거절 못할 제안을 하지 (2) | 2021.12.23 |