๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 9์ฃผ์ฐจ

๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 9์ฃผ์ฐจ

์ด์ „ ๊ธ€ ๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 8์ฃผ์ฐจ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ.

๐Ÿ‘€ ์˜ค๋Š˜์˜ ํ•  ์ผ

  • ๐Ÿง‘โ€๐Ÿ’ป MNIST Classification ์‹ค์Šต

๐Ÿง‘โ€๐Ÿ’ป MNIST Classification ์‹ค์Šต

ํŠน๊ฐ• ์‹ค์Šต์—์„œ Fashion MNIST๋ฅผ ์ด์šฉํ•œ Classification์€ ์ง์ ‘ ์‹ค์Šตํ–ˆ์œผ๋‚˜, ์ „ํ†ต์ ์ธ MNIST์— ๋Œ€ํ•œ ์‹ค์Šต์€ ํ•˜์ง€ ์•Š์•˜์—ˆ๋‹ค. ์˜ค๋Š˜์€ ๊ฐ€๋ณ๊ฒŒ Fashion MNIST ์‹ค์Šต์„ ์ฐธ๊ณ ํ•˜์—ฌ MNIST Classification์„ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Import

ํ…์„œํ”Œ๋กœ์šฐ 2.0, keras, numpy, matplotlib, collections๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

try:
  # Colab only
  %tensorflow_version 2.x
except Exception:
  pass

import tensorflow as tf
from tensorflow import keras

import numpy as np
import matplotlib.pyplot as plt
import collections as col

colab์€ ๊ธฐ๋ณธ์ ์œผ๋กœ tensorflow 1๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” 2๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค. colab์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Dataset ๊ฐ€์ ธ์˜ค๊ธฐ

keras์—์„œ๋Š” MNIST ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ›ˆ๋ จ์…‹๊ณผ ํ…Œ์ŠคํŠธ์…‹์„ ์†์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

print(train_images.shape)
print(train_labels.shape)
print(test_images.shape)
print(test_labels.shape)
์ˆ˜ํ–‰๊ฒฐ๊ณผ

Label ๋ณ„ ๊ฐœ์ˆ˜ ํ™•์ธ

collections์˜ Counterํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด label๋ณ„๋กœ ๋ช‡๊ฐœ์”ฉ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Fashion MNIST์™€๋Š” ๋‹ฌ๋ฆฌ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. ๋ณด๊ธฐ์ข‹๊ฒŒ matplotlib์˜ histogram์„ ํ†ตํ•ด ์‹œ๊ฐํ™” ํ•ด ๋ณด์•˜๋‹ค.

col.Counter(train_labels)
col.Counter(test_labels)
plt.hist(train_labels, color = 'green', alpha = .5)
plt.hist(test_labels, color = 'green', alpha = .5)
์ˆ˜ํ–‰๊ฒฐ๊ณผ
์ˆ˜ํ–‰๊ฒฐ๊ณผ

์ด๋ฏธ์ง€ ํ™•์ธ

ํ›ˆ๋ จ ์ด๋ฏธ์ง€ ์…‹์—์„œ ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

plt.figure(figsize = (10, 10))        # ์ „์ฒด ํ”ผ๊ฒจ ์‚ฌ์ด์ฆˆ๋ฅผ 10*10์œผ๋กœ
for i in range(25) :
  plt.subplot(5, 5, i + 1)
  plt.xticks([])                      # x ๋ˆˆ๊ธˆ ์ œ๊ฑฐ
  plt.yticks([])                      # y ๋ˆˆ๊ธˆ ์ œ๊ฑฐ
  plt.xlabel(train_labels[i])         # x ์ถ• ๋ผ๋ฒจ์— ์ •๋‹ต
  plt.imshow(train_images[i])
์ˆ˜ํ–‰๊ฒฐ๊ณผ

์ด๋ฏธ์ง€ ๋ถ„์„, ์ •๊ทœํ™”

์ด๋ฏธ์ง€๋Š” 255๊นŒ์ง€์˜ ๊ฐ•๋„๋ฅผ ๊ฐ–๋Š” ํ”ฝ์…€ 24*24๊ฐœ๋กœ ์ด๋ฃจ์–ด ์ ธ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 255๋กœ ๋‚˜๋ˆ ์คŒ์œผ๋กœ ์จ ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ํ”ฝ์…€์„ 0~1์‚ฌ์ด์˜ ์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ •๊ทœํ™”) 255๋กœ ๋‚˜๋ˆˆ ๋’ค, Counter์™€ figure๋ฅผ ํ†ตํ•ด ์ •๊ทœํ™”๊ฐ€ ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

col.Counter(train_images[0].reshape(784))    # 0 ๋ฒˆ์งธ ์ด๋ฏธ์ง€(24*24 2์ฐจ์› ๋ฐฐ์—ด)๋ฅผ 784์‚ฌ์ด์ฆˆ์˜ 1์ฐจ์› ๋ฐฐ์—ด๋กœ reshapeํ•˜์—ฌ ์š”์†Œ(์ƒ‰์„ ๊ฒฐ์ •ํ•˜๋Š” ์ˆ˜์น˜)๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.
์ˆ˜ํ–‰๊ฒฐ๊ณผ

0~255์˜ ๊ฐ’์„ ๊ฐ–๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

train_images = train_images / 255.0
test_images = test_images / 255.0

col.Counter(train_images[0].reshape(784))
์ˆ˜ํ–‰๊ฒฐ๊ณผ

255.0์œผ๋กœ ๋‚˜๋ˆ„์–ด 0~1.0์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ–๊ฒŒ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

plt.figure(figsize = (10, 10))
plt.imshow(train_images[0])
plt.colorbar()
plt.show()
์ˆ˜ํ–‰๊ฒฐ๊ณผ

figure()๋ฅผ ํ†ตํ•ด ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด์•„์„œ๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•™์Šต ๋ชจ๋ธ

keras๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. costํ•จ์ˆ˜๋กœ sparse categorical crossentropy๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. crossentropy๋Š” ๋‹จ์ˆœํžˆ ๋งž์•˜๋ƒ ํ‹€๋ฆฌ๋ƒ๋กœ๋งŒ cost๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์–ผ๋งˆ์˜ ์ฐจ์ด๋กœ ์ธํ•ด ํ‹€๋ ธ๋Š”์ง€ ๊นŒ์ง€ ๊ณ„์‚ฐ์— ํฌํ•จํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ„๋ฅ˜๋ฌธ์ œ์—์„œ ๋” ๋‚˜์€ cost๋ฅผ ๊ณ„์‚ฐํ•ด๋‚ธ๋‹ค. ๊ด€๋ จ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ์ฐธ์กฐํ–ˆ๋‹ค. crossentropy์ค‘์—์„œ๋„ sparse๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” one-hot encoding๋˜์–ด์žˆ๋Š” ์ž๋ฃŒ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Optimizer๋Š” Adam optimizer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๋Š” Optimizer๋กœ, Optimizer์˜ ๋ํŒ์™•(..)์ด๋ผ๋Š” ๋ง๋„ ์žˆ๋‹ค. ์‚ฌ์‹ค ์•„์ง ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณด์ง€ ์•Š์•„์„œ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅธ๋‹ค. ์ฐจํ›„์— ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค.

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape = (28, 28)))
model.add(keras.layers.Dense(128, activation = 'relu'))
model.add(keras.layers.Dense(10, activation = 'softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=10)
์ˆ˜ํ–‰๊ฒฐ๊ณผ

ํ›ˆ๋ จ ์…‹์— ๋Œ€ํ•ด์„œ 99%๊นŒ์ง€์˜ ์ •ํ™•๋„๊ฐ€ ๋‚˜์˜ฌ ์ •๋„๋กœ ํ•™์Šต์ด ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒ€์ฆ

ํ•™์Šต๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆ. model.evaluate()๋ฅผ ํ†ตํ•ด์„œ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

loss, accuracy = model.evaluate(test_images,  test_labels, verbose = 1)
print('\ntest loss\t: ', loss)
print('test accuracy\t: ', accuracy)
์ˆ˜ํ–‰๊ฒฐ๊ณผ

ํ…Œ์ŠคํŠธ ์…‹์— ๋Œ€ํ•ด์„œ๋Š” ์ •ํ™•๋„๊ฐ€ 97%๊ฐ€๋Ÿ‰์ด ๋‚˜์˜ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ฌด๋ ˆ๋„ ํ›ˆ๋ จ ์…‹์— ๋Œ€ํ•œ overfitting์ด ์•ฝ๊ฐ„ ์žˆ๋Š”๊ฒƒ์œผ๋กœ ์ถ”์ •๋œ๋‹ค.

predictions = model.predict(test_images)
plt.figure(figsize=(20,20))
for i in range(25) :
  plt.subplot(5, 5, i+1)
  plt.imshow(test_images[i])
  plt.xticks([])
  plt.yticks([])
  description = str(np.argmax(predictions[i])) + " / " + str(test_labels[i])
  plt.xlabel(description)
plt.show()
์ˆ˜ํ–‰๊ฒฐ๊ณผ

ํ…Œ์ŠคํŠธ ์…‹ ์ดˆ๊ธฐ 25๊ฐœ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ด๋ฏธ์ง€์™€ ์˜ˆ์ธก๊ฐ’, ์ •๋‹ต์„ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ๋„๋ก ์ถœ๋ ฅํ•ด๋ณด์•˜๋‹ค.

์ด์ „์— Fashion MNIST๋ฅผ ํ†ตํ•ด ์‹ค์Šตํ•ด๋ณธ ๊ฒฝํ—˜์œผ๋กœ ์ธํ•ด ์ด๋ฒˆ ์‹ค์Šต์€ ์–ด๋ ต์ง€์•Š๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ ์ €๋ฒˆ์— ๋„์ „ํ–ˆ๋˜ Bank marketing dataset ์‹ค์Šต๊ณผ ๋‹ฌ๋ฆฌ ์ด๋ฒˆ MNIST classification์—์„œ๋Š” ์˜ค์ง Keras๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์–ด์„œ ์ด์ œ๋Š” ์ •๋ง ๋”ฅ๋Ÿฌ๋‹์ด ๋งŽ์ด ๋Œ€์ค‘ํ™”๊ฐ€ ๋˜์—ˆ์Œ์„ ๋А๊ผˆ๋‹ค.

Share: Twitter Facebook
Seunghun Yang's Picture

About Seunghun Yang

Seunghun is undergraduate student at Computer Science Engineering in CNU(Chungnam National University).

Daejeon, South Korea

Comments