본문 바로가기
카테고리 없음

[딥러닝1] 4강. MNIST

by 0_mini 2024. 8. 8.

MNIST

MNIST(Mixed National Institute of Standards and Technology) 데이터셋은 머신러닝계의 'Hello world!'와 같다.

사람들이 0부터 9까지의 수를 손으로 작성하였고 훈련 데이터는 6만장, 테스트 데이터는 1만장 총 7만장을 모았다.

머신러닝에서는 데이터를 항상 훈련 데이터와 테스트 데이터 혹은 훈련 데이터와 테스트 데이터, 검증 데이터로 나눈다.

그 중 훈련 데이터와 테스트 데이터 두가지로 나누는 것을 살펴보면,

 

훈련 데이터 (Training Data) : 모델을 학습시키기 위해 사용되는 데이터이다.

테스트 데이터 (Test Data) : 학습된 모델의 성능을 평가하기 위해 사용되는 데이터이다.

 

머신러닝에서 위의 두 데이터를 절대 섞지 않는 것이 철칙이다.

각 데이터는 이미지와 라벨로 이루어지는데 라벨은 그 숫자를 작성한 사람이 9라고 썼다고 표기하는 것이다.

각 이미지는 28x28 해상도의 흑백 사진으로 표현되어있다.

각 픽셀은 0부터 255의 밝기로 표현되어있다.

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import loat_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten = True, normalize = False)

img = x_train[0]
label = t_train[0]
print(label)

print(img.shape)
img = img.reshape(28, 28)
print(img.shape)

img_show(img)

 

현재 실행중인 프로그램에서 버전이 안맞는지 위의 코드가 돌아가지 않아 새롭게 작성해봤다.

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# TensorFlow를 사용하여 MNIST 데이터셋 로드
(x_train, t_train), (x_test, t_test) = tf.keras.datasets.mnist.load_data()

# 데이터셋 정보 출력
img = x_train[0]
label = t_train[0]
print(f"Label: {label}")
print(f"Original shape: {img.shape}")

# 이미지 시각화
plt.imshow(img, cmap='gray')
plt.title(f"Label: {label}")
plt.show()

# 이미지 시각화
plt.figure(figsize=(10, 10))
for i in range(25):
    plt.subplot(5, 5, i + 1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(x_train[i], cmap='gray')
    plt.xlabel(str(t_train[i]))
plt.show()

# NumPy 배열 출력 옵션 설정
np.set_printoptions(linewidth = 200, threshold = 1000)  # 한 줄에 출력할 최대 문자 수 설정
print(img)
[[  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   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   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   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   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   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136 175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253 225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251  93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   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 139 253 190   2   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   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  35 241 225 160 108   1   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119  25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253 150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252 253 187   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 249 253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253 253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253 250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201  78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   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   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   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   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]]

 

이러한 행렬들을 벡터 형태로 바꿔줘야한다. 3x3 행렬은 9차원 벡터가 된다. 28x28 행렬은 784차원 벡터가 된다.

이러한 과정들을 Flatten이라고 한다.

숫자 8이라는 28x28 행렬의 이미지를 flatten을 하여 784차원 벡터로 변환해 Neural Network에 집어 넣는다.

affine, sigmoid, affine, softmax를 통해 확률로 변환한다. 이미지의 숫자가 8일 확률을 돌려준다.

Scalar, Vector, Matrix, Tensor

sclalar : [1], 0차원 tensor (점)

vector : [1, 1], 1차원 tensor (선)

matrix : [[1, 1], [1, 1]], 2차원 tensor (면)

3-tensor : [[[1, 1], [1, 1]], [[1, 1], [1, 1]],[[1, 1], [1, 1]]], 3차원 tensor n-tensor

 

MNIST 데이터의 shape

x_train.shape
(60000, 28, 28)
x_train.ndim
3

 

color 사진일 경우엔 N(사진 장수) x C(RGB) x H(세로 해상도) x W(가로 해상도)

흑백 사진은 포맷을 맞춰주기 위해 C를 1로 둔다.

60000 x 1 x 28 x 28