MNIST 데이터베이스 (Modified National Institue of Standards and Technology database)
손글씨 이미지 데이터셋
0에서 9까지 10가지로 분류될 수 있는 손글씨 숫자 이미지 70,000개
각 이미지는 28×28 픽셀로 구성
각 픽셀은 아래와 같이 0~255 사이의 숫자 행렬로 표현됩니다.
[[ 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]]
60,000개의 이미지는 훈련 (Training)에 사용
10,000개의 이미지는 테스트 (Test)에 사용
코드
1. tensorflow 불러오기
# Tf를 쓰면 무려 Mnist 데이터를 다운받지 않아도 됨.
>>> import tensorflow as tf
2. MNIST 데이터셋 불러오기 (import)
# Tf에서는 train / test set을 자동으로 나눔.
>>> mnist = tf.keras.datasets.mnist
>>> (x_train, y_train), (x_test, y_test) = mnist.load_data()
3. 데이터 전처리
# mnist 데이터는 0~255 범위의 데이터
# 딥러닝은 0~1 사이로 input 데이터의 범위를 해줘야 원활한 학습이 가능.
# 0~1 사이로 맞춰주기 위해서 255로 나눔.
>>> x_train, x_test = x_train / 255.0, x_test / 255.0
>>> x_train.shape
4. 모델구성
# tf.keras.models.Sequential()을 이용해서 인공신경망 모델을 구성
>>> model = tf.keras.models.Sequential([
# 입력층 (Input layer)에서 Flatten()을 이용해서 28×28 픽셀의 값을 784개의 1차원 배열로 변환
... tf.keras.layers.Reshape((28, 28, 1)),
# 각 층은 512개와 10개의 인공 뉴런 노드를 갖고 활성화 함수 (activation function)로는 각각 ReLU (tf.nn.relu)와 소프트맥스 (tf.nn.softmax) 사용.
... tf.keras.layers.Conv2D(16, 3, activation='relu'),
... tf.keras.layers.Flatten(),
... tf.keras.layers.Dense(128),
... tf.keras.layers.Dense(10, activation='softmax')
... ])
5. 모델 컴파일
>>> model.compile(optimizer='adam',
... loss='sparse_categorical_crossentropy',
... metrics=['accuracy'])
6. 모델 훈련
>>> model.fit(x_train, y_train, epochs=5)
7. 모델 평가
# model.evaluate()를 이용해서 10,000개의 테스트 샘플에 대해 손실 (loss)과 정확도 (accuracy)를 평가
>>> test_loss, test_acc = model.evaluate(x_test, y_test)
>>> print('테스트 정확도:', test_acc)
# Matplotlib을 이용해서 에포크에 따른 정확도 (accuracy)와 손실 (loss) 값을 확인
>>>loss, accuracy = [], []
>>>for i in range(10):
... model.fit(x_train, y_train, epochs=1)
... loss.append(model.evaluate(x_test, y_test)[0])
... accuracy.append(model.evaluate(x_test, y_test)[1])
>>>print(accuracy)
코드 (copy & paste & run)
import tensorflow as tf
# Tf를 쓰면 무려 Mnist 데이터를 다운받지 않아도 됩니다.
mnist = tf.keras.datasets.mnist
# 또한 train / test set을 알아서 나눠 줍니다.
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# mnist 데이터는 0~255 범위의 데이터 입니다.
# 이를 0~1 사이로 맞춰주기 위해서 255로 나누는 것인데
# 딥러닝은 0~1 사이로 input 데이터의 범위를 해줘야 학습이 잘 됩니다.
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train.shape
model = tf.keras.models.Sequential([
tf.keras.layers.Reshape((28, 28, 1)),
tf.keras.layers.Conv2D(16, 3, activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
## 모델 평가
# model.evaluate(x_test, y_test, verbose=2)
# 코드를 읽고, 코딩하기도 편하게 따로 불러와줍니다.
test_loss, test_acc = model.evaluate(x_test, y_test)
print('테스트 정확도:', test_acc)
#1회의 에포크마다 model.evaluate()의 loss, accuracy 값을 출력력
loss, accuracy = [], []
for i in range(10):
model.fit(x_train, y_train, epochs=1)
loss.append(model.evaluate(x_test, y_test)[0])
accuracy.append(model.evaluate(x_test, y_test)[1])
print(accuracy)
# end of code