본문 바로가기
Coding/AI

이미지 딥러닝 기초 mnist 써보기

by 루민즈 2023. 10. 15.
반응형

안녕하세요 

딥러닝은 텍스트,오디오,이미지,영상 등을 인식합니다. 

이를 인식하기 위해서는 데이터셋을 모델에 학습을 시켜줘야되는데요 이중 간단하게 mnist 이미지 데이터셋을 불러와 학습을 시킨후 인식을 시켜봅시다. 

 

mnist 데이터는 텐서플로의 케라스 API를 이용해 불러올수 있습니다. 

 

MNIST 데이터셋 불러오기 

mnist 데이터셋을 불러올려면 텐서플로의 케라스 API를 이용해 간단히 불러 올수 있습니다. 

 

from tensorflow.keras.datasets import mnist

 

mnist 이미지 데이터셋은 0부터 9까지 손글씨로 총 10개의 숫자로 이루어져 있습니다. 학습이 사용될부분 6만개 테스트에 사용될 부분은 1만개로 총 7만개의 이미지 데이터셋으로 구성되어 있습니다. 

 

mnist 데이터셋

학습에 사용될 부분과 테스트에 사용될 부분을 각각 X_train, y_train / X_test,y_test로 나누었습니다. 

이 데이터를 로드해보고 이미지 갯수를 출력해봅시다. 그다음 데이터가 어떻게 구성되어 있는지 확인해봅시다. 

 

(X_train, y_train),(X_test,y_test) = mnist.load_data()

print("학습셋 이미지 수: %d개" %(X_train.shape[0]))
print("테스트셋 이미지 수: %d개" %(X_test.shape[0]))

import matplotlib.pyplot as plt

plt.imshow(X_train[0], cmap='Greys')
plt.show()

 

출력을 해보면 다음과 같은 결과를 얻을수 있다는걸 확인할수있습니다. 

 

학습셋 이미지 수: 60000개
테스트셋 이미지 수: 10000개

컴퓨터는 데이터를 숫자로 저장합니다. 이미지 데이터 역시 숫자로 저장되어 있는데요 저위에 이미지를 숫자로 출력해봅시다. 

 

import sys

for x in X_train[0]:
  for i in x:
    sys.stdout.write("%-3s" % i)
  sys.stdout.write('\n')

 

그럼 다음과 같이 검은색 부분에 농도에 따라 숫자가 커지는걸 확인할수 있습니다. 

사진을 보면 총 가로 28 세로 28  총 784개의 픽셀로 구성되어 있다는걸 확인할수 있습니다. 이제 이 28 x 28 2차원 배열을 1 x 784 픽셀로 이루어진 1차원 배열로 변경해야됩니다. 

 

이때 쓰이는 함수가 reshape() 함수입니다. 

 

X_train = X_train.reshape(X_train.shape[0],784)

 

케라스는 데이터를 0에서 1사이로 변환하면 구동할때 최적의 성능을 보입니다. 따라서 0 ~ 255 사이값으로 나타난 위 이미지 데이터를 0 ~ 1 사이로 바꿔야 됩니다. 이때 쓰이는 함수가 astype()함수입니다. 학습셋과 훈련셋 전부다 해줍니다. 

그다음 숫자 이미지에 매겨진 레이블을 확인해줍니다. 

 

X_train = X_train.astype('float64')
X_train = X_train / 255 

X_test = X_test.reshape(X_test.shape[0],784).astype('float64') / 255 

print("class : %d " % (y_train[0]))

그럼 class  : 5 가 출력이 됩니다. 

class : 5

 

원핫 인코딩

분류 문제를 해결하려면 이경우 클래스가 10개 밖에 안되므로 원핫 인코딩이라는 방식을 적용 해야됩니다. 클래스가 많아지면 원핫 인코딩 보단 다른 방식(ex : 카테고리 임베딩 등등)을 써야됩니다. 메모리랑 모델의 복잡성을 증가 시킵니다. 

 

다시 본론으로 들어가서 원핫 인코딩이란 범주형 데이터를 수치 데이터로 변환하는 방법중 하나입니다.

 

 

 

범주형 데이터란 여러 범주 또는 카테고리 중 하나에 속하는 데이터를 나타냅니다. 예를 들어, 동물의 종류 (고양이, 강아지, 새) 또는 제품의 카테고리 (의자, 테이블, 소파)와 같은 데이터가 범주형 데이터의 예입니다.

 

원핫 인코딩은 다음과 같이 동작합니다:

 

각 범주마다 고유한 정수 인덱스를 할당합니다. 예를 들어, "고양이"는 0, "강아지"는 1, "새"는 2로 매핑됩니다.

각 범주의 인덱스를 나타내는 벡터를 생성합니다. 이 벡터는 해당 범주의 인덱스 위치에 1을 표시하고 나머지 위치에는 0을 표시합니다. 이 벡터는 이 범주가 어떤 것인지를 명확하게 표현하는 방법으로 사용됩니다.

예를 들어, "고양이" 범주를 원핫 인코딩하면 다음과 같이 표현됩니다:

 

고양이: [1, 0, 0]

강아지: [0, 1, 0]

새: [0, 0, 1]

이렇게 하면 범주형 데이터가 수치형 데이터로 변환되어 머신러닝 모델에서 사용하기 쉬워집니다. 각 범주는 서로 독립적인 이진 변수로 표현되며, 상대적인 관계를 표현하지 않습니다. 이것은 분류 문제에서 주로 사용되며, 각 범주에 해당하는 클래스 레이블을 지정하고 해당 클래스를 예측하는 데 도움이 됩니다.

 

 

 

아까 방금 열어본 클래스는 5 였습니다. 이걸 [0,0,0,0,0,1,0,0,0,0] 으로 바꾸어야 합니다.

 

이때 쓰이는 함수가 바로 np_utils.to_categorical() 함수입니다.

 

from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train,10)
y_test = to_categorical(y_test,10) 

print(y_train[0])

 

실행을 시켜보면 원핫인코딩이 적용된걸 확인하실수 있습니다. 

 

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

이제 학습시킬 준비가 완료되었습니다. 다음엔 실제 전체 코드로 학습시키고 테스트를 시켜봐요


Post

다음글 무직자 대출 알아보기 >