24 Sat

๋”ฅ๋Ÿฌ๋‹ CNN ์™„๋ฒฝ ๊ฐ€์ด๋“œ - Fundamental ํŽธ

Tensorflow 2.X ์™€ tf.keras ์†Œ๊ฐœ

ํ…์„œํ”Œ๋กœ์šฐ 2.0์ด 19๋…„๋„ 1์›”์— ๋‚˜์™”์Œ

์ด ๋ฒ„์ „ ์ด์ „์—๋Š” ์ผ€๋ผ์Šค๊ฐ€ ๋‹จ๋…์œผ๋กœ ์žˆ์—ˆ๋Š”๋ฐ ๋ฒ„์ „ ์ดํ›„์—๋Š” ํ…์„œํ”Œ๋กœ์šฐ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋กœ ํฌํ•จ๋œ๋‹ค.

๊ธฐ์กด ์ผ€๋ผ์Šค ๋ณด๋‹ค ํ…์„œํ”Œ๋กœ์šฐ ์„œ๋ธŒ ํŒจํ‚ค์ง€์ธ ์ผ€๋ผ์Šค๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค

# 2.0 ์ด์ „
from keras.layers import Dense

# 2.0 ์ดํ›„
from tensorflow.keras.layers import Dense

์ด๋ฏธ์ง€ ๋ฐฐ์—ด์˜ ์ดํ•ด

Image ์ƒ‰์ƒ ๋ชจ๋ธ

  • ์ด๋ฏธ์ง€๋Š” 0๋ถ€ํ„ฐ 255๊นŒ์ง€์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ํ”ฝ์…€๋กœ ํ‘œํ˜„ํ•œ๋‹ค

    • 0์€ Black, 255๋Š” White

  • Grayscale : height * width ํ˜•ํƒœ์˜ 2์ฐจ์› ๋ฐฐ์—ด

  • Color : height * width * channel ํ˜•ํƒœ์˜ 3์ฐจ์› ๋ฐฐ์—ด

๋ฐฐ์—ด ์ฐจ์›

  • ์—ฌ๋Ÿฌ ์žฅ์˜ Grayscale ์ด๋ฏธ์ง€ : 3์ฐจ์›

  • ์—ฌ๋Ÿฌ ์žฅ์˜ RGB ์ด๋ฏธ์ง€ : 4์ฐจ์›

ํ…์„œ ๋ชจ๋ธ ๊ตฌ์ถ•์‹œ ํ•ญ์ƒ 3์ฐจ์›์˜ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ฑ์žฅ์˜ ๊ธฐ์ค€์„ 3์ฐจ์›์œผ๋กœ ๋ณด๊ธฐ ๋•Œ๋ฌธ(?)

  • ๋’ค์—์„œ ๋‹ค์‹œ ๋‹ค๋ฃฐ ๊ฒƒ

Dense Layer๋กœ Fashion MNIST ์˜ˆ์ธก ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜๊ธฐ - ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํ™•์ธ ๋ฐ ์‚ฌ์ „ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

import matplotlib.pyplot as plt
%matplotlib inline 

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

def show_images(images, labels, ncols=8):
    figure, axs = plt.subplots(figsize=(22, 6), nrows=1, ncols=ncols)
    for i in range(ncols):
        axs[i].imshow(images[i], cmap='gray')
        axs[i].set_title(class_names[labels[i]])
        
show_images(train_images[:8], train_labels[:8], ncols=8)
show_images(train_images[8:16], train_labels[8:16], ncols=8)

  • plt.subplots ์€ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. axs๋Š” ๊ฐ n๋ฒˆ์งธ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„

์„ฑ๋Šฅ์ด ์ค€์ˆ˜ํ•˜๊ฒŒ ๋‚˜์˜จ ์ด์œ ๋Š” ๋ฌผ์ฒด๊ฐ€ ์ด๋ฏธ์ง€ ์ • ์ค‘์•™์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ.

  • 1์ฐจ์›์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์•ˆ์ข‹๊ฒŒ ๋‚˜์™€์•ผ ์ •์ƒ!

  • 2์ฐจ์›์œผ๋กœ ์ž…๋ ฅ๋ฐ›์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฏธ์ง€์˜ ์ง€์—ญ์  ํŠน์„ฑ์„ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ž…

Dense Layer๋กœ Fashion MNIST ์˜ˆ์ธก ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ชจ๋ธ ์„ค๊ณ„ ๋ฐ ํ•™์Šต ์ˆ˜ํ–‰

from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Sequential

model = Sequential([
    Flatten(input_shape=(INPUT_SIZE, INPUT_SIZE)),
    Dense(100, activation='relu'),
    Dense(30, activation='relu'),
    Dense(10, activation='softmax')
])

model.summary()
  • Dense๋Š” ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

  • Dense๋Š” 1์ฐจ์› ๋ฐ์ดํ„ฐ๋งŒ ์ž…๋ ฅ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Flatten์œผ๋กœ 1์ฐจ์› ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค

Keras Layer API ๊ฐœ์š”

์ผ€๋ผ์Šค๊ฐ€ ์ข‹์€ ์ด์œ ๋Š” ๋ ˆ์ด์–ด ๊ตฌ์„ฑ์ด ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ

  • Dense layer(activate=None) + Activation layer(sigmoid)= Dense layer(activate=sigmoid)

  • Core layers, Pooling layes, Convolution layes, Activation layers ๋“ฑ์ด ๋‹ค์–‘ํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค.

Dense Layer๋กœ Fashion MNIST ์˜ˆ์ธก ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜๊ธฐ - ์˜ˆ์ธก ๋ฐ ์„ฑ๋Šฅ ํ‰๊ฐ€

history = model.fit(x=train_images, y=train_oh_labels, batch_size=32, epochs=20, verbose=1)
  • ๋ชจ๋ธ์—์„œ ์ž…๋ ฅ์„ 3์ฐจ์›(2์ฐจ์› ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ์—ฌ๋Ÿฌ์žฅ)์œผ๋กœ ๋„ฃ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ชจ๋ธ์€ 2์ฐจ์›์œผ๋กœ ์ž…๋ ฅ์„ ๊ฐ„์ฃผํ•˜๊ฒŒ ๋œ๋‹ค.

  • ๋”ฐ๋ผ์„œ, ์‚ฌ์ง„์„ ๋‹จ์ผ๋กœ ์ž…๋ ฅํ•  ๋•Œ๋Š” ์ฐจ์› ๋ณ€ํ™˜์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

    • ๋งŒ์•ฝ (10000, 28, 28) ์ด ์—ˆ๋‹ค๋ฉด ํ•œ์žฅ์„ ๋„ฃ์„ ๋•Œ (28, 28)๋กœ ์ž…๋ ฅ์ด ๋˜๋ฏ€๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

    • (1, 28, 28)๋กœ ๋ฐ”๊ฟ”์„œ ์ž…๋ ฅ๊ฐ’์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

  • ์ด๊ฒƒ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ np.expand_dims ์ด๋‹ค.

    • np.expand_dims(test-images[0], axis=0).shape

    • (1, 28, 28)

  • ์ด ๋•Œ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถœ๋ ฅ๊ฐ’์˜ ๋ชจ์–‘๋„ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. ์ถœ๋ ฅ์ด (1, 28, 28)๋กœ ๋‚˜์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ

๋ชจ๋ธ ์„ฑ๋Šฅ ๊ฒ€์ฆ

  • model.evaluate ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ‰๊ฐ€๋ฅผ ํ•œ๋‹ค.

Dense Layer๋กœ Fashion MNIST ์˜ˆ์ธก ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜๊ธฐ - ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•™์Šต ์ˆ˜ํ–‰

ํ•™์Šต ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณผ์ ํ•ฉ ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ํ‰๊ฐ€ํ•ด๋ด์•ผ ํ•œ๋‹ค. ์ด ๋•Œ ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๋‹ค.

  • ์–ด์ฐจํ”ผ ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ์—๋Ÿฌ๋Š” ์ค„์–ด๋“ค ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

๋˜ํ•œ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„ ์ง€์ง€ ์•Š์„ ๋•Œ Callback์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต๋ฅ ์„ ๋ณด์ • ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์—์„œ ์ชผ๊ฐœ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ ์ง€์›ํ•œ๋‹ค.

from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical

# ๊ธฐ์กด ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ๋ถ„๋ฆฌ
tr_images, val_images, tr_labels, val_labels = train_test_split(train_images, train_labels, test_size=0.15, random_state=2021)
print('train๊ณผ validation shape:', tr_images.shape, tr_labels.shape, val_images.shape, val_labels.shape)
  • random_state=2021 : ํ•™์Šต ๋ฐ์ดํ„ฐ์™€ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋  ๋•Œ ๋งค๋ฒˆ ๋‹ค๋ฅด๊ฒŒ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด seed๋ฅผ ์ •ํ•œ๋‹ค.

history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128, validation_data=(val_images, val_oh_labels), 
                    epochs=20, verbose=1)
  • ํ•™์Šต ๋ฐ์ดํ„ฐ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ผ๋ฒจ์ด ๋ถ„๋ฆฌ๋˜์„œ ์ž…๋ ฅ๋˜์ง€๋งŒ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํŠœํ”Œ๋กœ ์ž…๋ ฅํ•œ๋‹ค.

  • ๋˜ํ•œ, model.fit ์ž์ฒด์—์„œ๋„ ๊ฒ€์ฆ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

    • ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ validation_date์— ๋„ฃ์–ด๋„ ๋˜๊ณ 

    • ๋งŒ๋“ค์ง€ ์•Š๊ณ  validation_split์„ ์„ค์ •ํ•ด๋„ ๋œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ GD๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ํ•™์Šต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ •ํ™•๋„๊ฐ€ ๋” ๋†’์€ ํŽธ์ด๋‹ค. ๋ฐ”๋žŒ์งํ•œ ๊ฒƒ์€ ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•๋„๋ณด๋‹ค ๊ต์ฐจ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•๋„๊ฐ€ ๋” ๋†’๊ฑฐ๋‚˜ ํ˜น์€ ๋™์ผํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

import matplotlib.pyplot as plt
%matplotlib inline

plt.plot(history.history['accuracy'], label='train')
plt.plot(history.history['val_accuracy'], label='valid')
plt.legend()
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด plt.plot ๊ณผ plt.legend() ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ํ•™์Šต์ด ์ง„ํ–‰๋ ์ˆ˜๋ก ๊ฐ„๊ฒฉ์ด ๋ฉ€์–ด์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Last updated

Was this helpful?