[CNN basic] ํ•ฉ์„ฑ๊ณฑ ์ธต, ํ’€๋ง ์ธต

2022. 4. 19. 12:35ใ†๐Ÿงช Data Science/ML, DL

 

 

 

 

CNN basic

ํ•ฉ์„ฑ๊ณฑ ์ธต, ํ’€๋ง ์ธต

 

 

 

 

CNN(Convolutional neural network)์ด๋ž€?

ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์€ ์‹œ๊ฐ ํ”ผ์งˆ ์•ˆ์˜ ๋‰ด๋Ÿฐ ์ž‘๋™๋ฐฉ์‹์„ ๋ณธ ๋”ฐ ๋งŒ๋“ค์–ด์ง„ ๋„คํŠธ์›Œํฌ์ด๋‹ค.

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ํ•ธ์ฆˆ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ 2ํŒ

 

 

์œ„ ๊ทธ๋ฆผ์€ ์‹ค์ œ ์‹œ๊ฐํ”ผ์งˆ์˜ ๋‰ด๋Ÿฐ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ธ๊ฐ„์˜ ๋ˆˆ์€ ์‚ฌ๋ฌผ์„ ํ•œ ๋ฒˆ์— ๋ฐ›์•„๋“ค์—ฌ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์‚ฌ๋ฌผ์ด ์ชผ๊ฐœ์ ธ์„œ ์ž…๋ ฅ๋˜๊ณ , ์ด๊ฒƒ๋“ค์ด ๋‰ด๋Ÿฐ ์—ฐ๊ฒฐ๋“ค์„ ๊ฑฐ์ณ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ์ธ์‹๋œ๋‹ค. ๊ตญ๋ถ€ ์ˆ˜์šฉ์žฅ์ด๋ผ๋Š” ๋ถ€๋ถ„(๋™๊ทธ๋ผ๋ฏธ)๋“ค์ด ๋‰ด๋Ÿฐ์— ์ž…๋ ฅ๋˜๊ณ , ์ด ์ž…๋ ฅ๊ฐ’๋“ค์ด ๋‹ค์‹œ ๊นŠ๊ฒŒ ์—ฐ๊ฒฐ๋˜๋ฉฐ ๋ณต์žกํ•œ ํŒจํ„ด์˜ ๊ฐ’๋“ค์„ ๋„์ถœํ•œ๋‹ค.

 

์ด์™€ ๊ฐ™์ด, ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์—์„œ๋„ ์ด๋ฏธ์ง€๋ฅผ ๋ถ€๋ถ„ ๋ถ€๋ถ„์œผ๋กœ ์ชผ๊ฐœ์„œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ด ์ž…๋ ฅ ๊ฐ’๋“ค์€ ๋‰ด๋Ÿฐ์˜ ์—ฐ๊ฒฐ ์†์—์„œ ๋” ์˜๋ฏธ ์žˆ๊ณ , ๊นŠ์€ ํŠน์ง•๋“ค๋กœ ๋ณ€ํ•˜์—ฌ ์ถœ๋ ฅ๋œ๋‹ค. 

* ๋ณธ ํฌ์ŠคํŒ…์€ Keras์™€ Tensorflow๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. Colab ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•  ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

[CNN์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ]

 

Image ์ž…๋ ฅ -> ํ•ฉ์„ฑ๊ณฑ ์ธต -> ํ’€๋ง ์ธต -> flatten -> ์™„์ „ ์‹ ๊ฒฝ๋ง -> ์ถœ๋ ฅ ์ธต

 

 

 

 

 

 

 

ํ•ฉ์„ฑ๊ณฑ ์ธต(convolutional layer)


CNN์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ.

 

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์ฒซ ๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ ์ธต์˜ ๋‰ด๋Ÿฐ์€ ์ด๋ฏธ์ง€ ์ „์ฒด ํ”ฝ์…€๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ํ•œ ๊ฐœ์˜ ๋‰ด๋Ÿฐ์ด ์ˆ˜์šฉํ•˜๋Š” ๋ฒ”์œ„์— ์žˆ๋Š” ํ”ฝ์…€๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ํ•ธ์ฆˆ ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ 2ํŒ

 

์˜ˆ๋ฅผ ๋“ค์–ด, 3x3 ๋ฒ”์œ„๋ฅผ ํ•˜๋‚˜์˜ ๋‰ด๋Ÿฐ์ด ์ธ์‹ํ•œ๋‹ค๊ณ  ํ•˜์ž. ๋นจ๊ฐ„์ƒ‰ ์‚ฌ๊ฐํ˜•์˜ ํ”ฝ์…€๊ฐ’์„ ์ฒซ ๋‰ด๋Ÿฐ์ด ์ธ์‹ํ•ด์„œ ๊ฐ€์ ธ๊ฐ€๊ณ , ๊ทธ๋‹ค์Œ ๋‰ด๋Ÿฐ์€ ํŒŒ๋ž€์ƒ‰ ์‚ฌ๊ฐํ˜•์˜ ํ”ฝ์…€๊ฐ’๋“ค์„ ์ธ์‹ํ•ด์„œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ๊ฐ„๋‹ค. 

 

์—ฌ๊ธฐ์„œ ์ž ๊น. ๋นจ๊ฐ„์ƒ‰ ์‚ฌ๊ฐํ˜•๊ณผ ํŒŒ๋ž€์ƒ‰ ์‚ฌ๊ฐํ˜•์˜ ๊ฐ„๊ฒฉ์€ ๋ชจ๋ธ๋ง์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ„๊ฒฉ์„ ์ŠคํŠธ๋ผ์ด๋“œ(stride)๋ผ๊ณ  ํ•œ๋‹ค. ์ด ๊ฐ„๊ฒฉ์„ ํฌ๊ฒŒ ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์ง€๋‚œ ๊ฐ’์€ ๋ณธ๋ž˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์งˆ ๊ฒƒ์ด๋‹ค.

์œ„ ๊ทธ๋ฆผ์˜ ์ŠคํŠธ๋ผ์ด๋“œ๋Š” ๊ฐ„๊ฒฉ์ด 1์ด๋ฏ€๋กœ, ์ŠคํŠธ๋ผ์ด๋“œ๋„ 1์ด๋‹ค. 

 

ํ•˜์ง€๋งŒ ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์ง€๋‚œ ๊ฐ’์ด ๋ณธ๋ž˜ ํฌ๊ธฐ์™€ ๊ฐ™๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒจ๋”ฉ(padding)์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

padding์˜ ์ฃผ์š” ์„ ํƒ์ง€

SAME - ํ•ฉ์„ฑ๊ณฑ ์ธต์— ์ œ๋กœ ํŒจ๋”ฉ์„ ์ ์šฉํ•œ๋‹ค. ์ฆ‰, ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์ง€๋‚˜๋„ ํฌ๊ธฐ๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด(SAME), ๋ณธ๋ž˜์˜ ๊ฐ’์— 0 ๊ฐ’๋“ค์„ ์ฃผ์œ„์— ๋ถ™์—ฌ์„œ ์ž…๋ ฅ๊ฐ’์„ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค.

VAILD - ํŒจ๋”ฉ ์—†์Œ. ์ฆ‰, ํ•ฉ์„ฑ๊ณฑ ์ธต์— ์ œ๋กœ ํŒจ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://stackoverflow.com/questions/52067833/how-to-plot-an-animated-matrix-in-matplotlib

 

 

๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ์œ„ ๊ทธ๋ฆผ์€ stride=1, padding='same' ์˜ต์…˜์„ ์ ์šฉํ•˜์—ฌ ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ํ†ต๊ณผ์‹œ์ผฐ๋‹ค.

 

 

 

 

 

 

 

ํ•„ํ„ฐ(filter)


ํŠน์„ฑ๋“ค์„ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด ํ•ฉ์„ฑ๊ณฑ ์ธต์— ๋ผ์›Œ ๋„ฃ๋Š” ํ•ฉ์„ฑ๊ณฑ ์ปค๋„.

 

 

๋‘ ๊ฐœ์˜ ํ•„ํ„ฐ๊ฐ€ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ฐ€์šด๋ฐ ํฐ ์ˆ˜์ง์„ ์ด ์žˆ๋Š” ๊ฒ€์€ ์‚ฌ๊ฐํ˜•(๊ฐ€์šด๋ฐ ์—ด์€ 1๋กœ ์ฑ„์›Œ์ ธ ์žˆ๊ณ , ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ 0์ธ 7x7 ํ–‰๋ ฌ)์ด๊ณ , ํ•˜๋‚˜๋Š” ๊ฐ€์šด๋ฐ ํฐ ์ˆ˜ํ‰์„ ์ด ์žˆ๋Š” ๊ฒ€์€ ์‚ฌ๊ฐํ˜•์ด๋‹ค. ์ž…๋ ฅ๊ฐ’์ด ์ด ์‚ฌ๊ฐํ˜•์„ ์ง€๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์‚ฌ๊ฐํ˜•์„ ์ง€๋‚˜๋ฉด ํฐ ์ˆ˜์ง์„ ์— ์žˆ๋˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’์€ ๋ชจ๋‘ ์—†์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์‚ฌ๊ฐํ˜•์„ ์ง€๋‚˜๋ฉด ํฐ ์ˆ˜ํ‰์„ ์— ์žˆ๋˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’์€ ๋ชจ๋‘ ์—†์–ด์ง„๋‹ค. 

* ์ž…๋ ฅ๊ฐ’์ด ํ•˜๋‚˜์˜ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ํ›„์—, ๋˜ ๋‹ค๋ฅธ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ์ฒด๋กœ ํ•˜๋‚˜์˜ ํŠน์„ฑ ๋งต์ด ๋œ๋‹ค. ์ฆ‰, ํ•„ํ„ฐ ๊ฐœ์ˆ˜๋งŒํผ ์ถœ๋ ฅ๊ฐ’์˜ ์ธต๋„ ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๋œป.

 

 

์™œ ์ด๋ ‡๊ฒŒ ๊ฐ’์„ ์—†์•จ๊นŒ?

๋‚จ๊ฒจ์ง„ ๊ฐ’(ํŠน์„ฑ)์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. 

์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ๋“ค์ด 40๊ฐœ, 100๊ฐœ๊ฐ€ ๋œ๋‹ค๋ฉด ์šฐ๋ฆฐ ์ž…๋ ฅ๊ฐ’์„ ๋งค์šฐ ๋‹ค์–‘ํ•œ ๊ฐ๋„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

์ถœ์ฒ˜: ํ•ธ์ฆˆ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ 2ํŒ

 

 

Tensorflow ๊ตฌํ˜„

 

from sklearn.datasets import load_sample_image
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt


# ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
china = load_sample_image("china.jpg") / 255

# ํ•„ํ„ฐ ์ ์šฉ ์ „
plt.imshow(china)
plt.show()

flower = load_sample_image("flower.jpg") / 255
images = np.array([china, flower])
batch_size, height, width, channels = images.shape

# ํ•„ํ„ฐ 2๊ฐœ ๋งŒ๋“ค๊ธฐ
filters = np.zeros(shape=(7,7,channels,2), dtype=np.float32)
filters[:,3,:,0] = 1        # ์ˆ˜์ง์„ 
filters[3,:,:,1] = 1        # ์ˆ˜ํ‰์„ 

outputs = tf.nn.conv2d(images, filters, strides=1, padding='SAME')

# ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ๋‘ ๋ฒˆ์งธ ํŠน์„ฑ ๋งต(์ˆ˜ํ‰์„ )์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
plt.imshow(outputs[0,:,:,1], cmap='gray')
plt.show()

 

 

 

[Code Summary]

- ๊ฐ ์ปฌ๋Ÿฌ ์ฑ„๋„์˜ ํ”ฝ์…€ ๊ฐ•๋„๋Š” 0~255 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ”์ดํŠธ ํ•˜๋‚˜๋กœ ํ‘œํ˜„๋œ๋‹ค. ์ด์— ์ด ํŠน์„ฑ์„ 255๋กœ ๋‚˜๋ˆ„์–ด 0~1 ์‚ฌ์ด์˜ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜

- 7x7 ํ•„ํ„ฐ ๋งŒ๋“ค๊ธฐ

- tf.nn.conv2d() : images๋Š” 4D tensor. filters๋Š” ์ ์šฉ๋œ ํ•„ํ„ฐ. strides=1. padding='same' ์ง€์ •.

 

 

 

์œ„๋Š” ํ•„ํ„ฐ๋ฅผ ์ง€๋‚œ ๊ทธ๋ฆผ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค. ์ƒ‰์ด ๋ณ€ํ•œ ๊ฒƒ์€ gray๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ง€๋งŒ, ๊ทธ๋ฆผ์ด ํ๋ฆฟํ•ด์ง„ ๊ฒƒ์€ ์ˆ˜ํ‰์„  ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ๋ฆฟํ•ด์ง„ ๊ทธ๋ฆผ์€ ํ•˜๋‚˜์˜ ํŠน์„ฑ ๋งต์ด๋‹ค. ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์ง€๋‚  ๋• ์ˆ˜๋งŽ์€ ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์น˜๊ณ  ๊ทธ๋งŒํผ ์ˆ˜๋งŽ์€ ํŠน์„ฑ ๋งต์ด ๋‚˜์˜จ๋‹ค.

 

 

 

์‹ค์ œ CNN์—์„œ๋Š” ํ›ˆ๋ จ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋กœ์„œ ํ•„ํ„ฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. 

ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์ •์˜ํ•ด์ค„ ๋•Œ, ํ•„ํ„ฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‹ ๊ฒฝ๋ง์ด ์ž˜ ๋งž๋Š” ํ•„ํ„ฐ๋ฅผ ์•Œ์•„์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

conv = keras.layers.Conv2D(filters=32, kernel_size=3, strides=1, padding='same', activation='relu')

 

[Code Summary]

3x3 ํฌ๊ธฐ์˜ 32๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ์ ์šฉ. 1 ์ŠคํŠธ๋ผ์ด๋“œ ๋‹จ์œ„๋กœ ์›€์ง์ด๋ฉฐ, ์ œ๋กœ ํŒจ๋”ฉ์„ ์ด์šฉํ•˜์—ฌ ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ถœ๋ ฅ์„ ์œ„ํ•ด ReLU ํ•จ์ˆ˜ ์ด์šฉํ–ˆ๋‹ค.

 

 

 

 

 

ํ’€๋ง ์ธต(pooling layer)


ํ’€๋ง ์ธต์˜ ๋ชฉ์ ์€ ๊ณ„์‚ฐ๋Ÿ‰๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด, ์ด๋ฏธ์ง€์˜ ์ถ•์†Œ๋ณธ(๋ถ€ํ‘œ๋ณธ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ๊ฐ์˜ ๋‰ด๋Ÿฐ์€ ์ผ์ • ์˜์—ญ ์‚ฌ๊ฐํ˜• ์•ˆ์˜ ํ”ฝ์…€๋งŒ์„ ์ธ์‹ํ•œ๋‹ค. ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ํฌ๊ธฐ, ์ŠคํŠธ๋ผ์ด๋“œ, ํŒจ๋”ฉ ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€๋งŒ ๊ฐ€์ค‘์น˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ๊ฐํ˜• ์•ˆ์˜ ํ”ฝ์…€๋“ค๋กœ ์ตœ๋Œ“๊ฐ’์„ ๋ฝ‘๊ฑฐ๋‚˜, ํ‰๊ท ์„ ๋‚ด๊ฑฐ๋‚˜ ํ•  ๋ฟ์ด๋‹ค. 

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ๋ฐ‘๋ฐ”๋‹ฅ ๋”ฅ๋Ÿฌ๋‹

 

 

 

ํ’€๋ง(pooling) ์ข…๋ฅ˜์—๋Š” ํฌ๊ฒŒ ์ตœ๋Œ€ ํ’€๋ง ์ธต, ์ „์—ญ ํ‰๊ท  ํ’€๋ง ์ธต์ด ์žˆ๋‹ค. 

 

์ตœ๋Œ€ ํ’€๋ง ์ธต - ์ผ์ • ์ˆ˜์ค€์˜ ๋ถˆ๋ณ€์„ฑ. ๋ถ„๋ฅ˜ ์ž‘์—…์ฒ˜๋Ÿผ ์˜ˆ์ธก์ด ์ž‘์€ ๋ถ€๋ถ„์—์„œ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๋งจํ‹ฑ ๋ถ„ํ• ๊ณผ ๊ฐ™์ด ๋“ฑ๋ณ€์„ฑ์ด ๋ชฉํ‘œ๊ฐ€ ๋˜๋Š” ์ž‘์—…์—์„  ์˜คํžˆ๋ ค ํšจ์šฉ์ด ๋–จ์–ด์ง„๋‹ค.

 

max_pool = keras.layers.MaxPool2D(pool_size=2)

 

 

์ „์—ญ ํ‰๊ท  ํ’€๋ง ์ธต - ๊ฐ ์ƒ˜ํ”Œ์˜ ํŠน์„ฑ ๋งต๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅ. ๋งค์šฐ ํŒŒ๊ดด์ ์ธ ์—ฐ์‚ฐ์ด์ง€๋งŒ ์ถœ๋ ฅ์ธต์—๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

global_avg_pool = keras.layers.GlobalAvgPool2D()

 

 

 

 

 

CNN ๊ตฌ์กฐ


๋งˆ์ง€๋ง‰, CNN ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ฐฐ์› ์œผ๋‹ˆ ์–ด๋–ป๊ฒŒ ์Œ“์•„์•ผ ํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ฐจ๋ก€๋‹ค.

์ „ํ˜•์ ์ธ CNN ๊ตฌ์กฐ๋Š” ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ๋ช‡ ๊ฐœ ์Œ“๊ณ (๊ฐ๊ฐ ReLU ์ธต์„ ๋’ค์— ๋†“๋Š”๋‹ค), ๊ทธ๋‹ค์Œ์— ํ’€๋ง์ธต, ๋˜ ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ์Œ“๊ณ , ๋‹ค์‹œ ํ’€๋ง ์ธต์„ ์Œ“๋Š” ์‹์ด๋‹ค. ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ํ†ต๊ณผํ• ์ˆ˜๋ก ์ด๋ฏธ์ง€๋Š” ์ž‘์•„์ง€์ง€๋งŒ ๋” ๊นŠ์€ ํŠน์„ฑ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธต์„ ๋ชจ๋‘ ์ซ™ ํ”ผ๊ณ  flatten(), ์™„์ „ ์‹ ๊ฒฝ๋ง์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์ถœ๋ ฅ์ธต๊นŒ์ง€ ๋ณด๋‚ด๋ฉด ์˜ˆ์ธก์ด ์ด๋ค„์ง„๋‹ค. 

 

์ถœ์ฒ˜: ์œ„ํ‚ค๋ฏธ๋””์–ด

 

 

๋ถ„๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ CNN Code

* ํŒจ์…˜ MNIST ๋ฐ์ดํ„ฐ์…‹ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ

model = keras.models.Sequential([
    keras.layers.Conv2D(64, 7, activation='relu', padding='same', input_shape=[28,28,1]),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(128, 3, activation='relu', padding='same'),
    keras.layers.Conv2D(128, 3, activation='relu', padding='same'),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(256, 3, activation='relu', padding='same'),
    keras.layers.Conv2D(256, 3, activation='relu', padding='same'),
    keras.layers.MaxPooling2D(2),
    keras.layers.flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(10, activation='softmax')
])

 

[Code Summary]

- ์ด๋ฏธ์ง€๊ฐ€ 28x28 ํ”ฝ์…€ ํฌ๊ธฐ์ด๊ณ , ํ•˜๋‚˜์˜ ์ปฌ๋Ÿฌ ์ฑ„๋„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ input_shape=[28,28,1]๋กœ ์ง€์ •

- ํ’€๋ง ํฌ๊ธฐ๊ฐ€ 2์ธ ์ตœ๋Œ€ ํ’€๋ง ์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณต๊ฐ„ ๋ฐฉํ–ฅ ์ฐจ์›์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๊ธฐ

- ํ•ฉ์„ฑ๊ณฑ ์ธต - ํ’€๋ง ์ธต ๋ฐ˜๋ณต

- ํ’€๋ง ์ธต ๋‹ค์Œ์—” ํ•ฉ์„ฑ๊ณฑ ์ธต์˜ ํ•„ํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

- ๊ณผ๋Œ€ ์ ํ•ฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด 50%์˜ ๋“œ๋กญ์•„์›ƒ ๋น„์œจ์„ ๊ฐ€์ง„ ๋“œ๋กญ์•„์›ƒ ์ธต์„ ์ถ”๊ฐ€

 

 

 

๋ฐ”๋กœ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„  ์œ„์˜ CNN๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ชจ๋ธ๋งํ•œ ํ›„, MNIST ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ•™์Šต, ์˜ˆ์ธก๊นŒ์ง€ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.