-
โฑ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 14์ฅ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง์ ์ฌ์ฉํ ์ปดํจํฐ ๋น์ โฑ๐ฎ ์ด๊ฒ์ ๊ฒ ๊ณต๋ถ/โฉ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2026. 1. 29. 17:14
14.1 ์๊ฐ ํผ์ง ๊ตฌ์กฐ
์๊ฐ ํผ์ง ์์ ๋ง์ ๋ด๋ฐ์ด ์์ ๊ตญ๋ถ ์์ฉ์ฅ์ ๊ฐ์ง๋ค.
๋ด๋ฐ๋ค์ ์์ผ์ ์ผ๋ถ ๋ฒ์ ์์ ์๋ ์๊ฐ ์๊ทน์๋ง ๋ฐ์ํ๋ค.
๋ด๋ฐ์ ์์ฉ์ฅ๋ค์ ์๋ก ๊ฒน์น ์ ์์ด์ ์ด๋ฅผ ํฉ์น๋ฉด ์ ์ฒด ์์ผ๋ฅผ ๊ฐ์ธ๊ฒ ๋๋ค.
์ด๋ค ๋ด๋ฐ์ ์ํ์ ์ ์ด๋ฏธ์ง์๋ง ๋ฐ์ํ๋ ๋ฐ๋ฉด ๋ค๋ฅธ ๋ด๋ฐ์ ๋ค๋ฅธ ๊ฐ๋์ ์ ๋ถ์ ๋ฐ์ํ๊ธฐ๋ ํ๋ค.
์ด๋ค ๋ ๋ด๋ฐ์ ๋์ผํ ์์ฉ์ฅ์ ๊ฐ์ง์ง๋ง ๋ค๋ฅธ ๊ฐ๋์ ์ ๋ถ์ ๋ฐ์ํ๋ค.
์ด๋ ใด๋ด๋ฐ์ ํฐ ์์ฉ์ฅ์ ๊ฐ์ ธ์ ์ ์์ค ํจํด์ด ์กฐํฉ๋ ๋ ๋ณต์กํ ํจํด์ ๋ฐ์ํ๋ค.
๊ณ ์์ค ๋ด๋ฐ์ด ์ด์ํ ์ ์์ค ๋ด๋ฐ์ ์ถ๋ ฅ์ ๊ธฐ๋ฐํ๋ค.
14.2 ํฉ์ฑ๊ณฑ ์ธต
CNN์ ๊ฐ์ฅ ์ค์ํ ๊ตฌ์ฑ ์์๋ ํฉ์ฑ๊ณฑ ์ธต์ด๋ค.
์ฒซ ๋ฒ์จฐ ํฉ์ฑ๊ณฑ ์ธต์ ๋ด๋ฐ์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋ชจ๋ ํฝ์ ์ ์ฐ๊ฒฐ๋๋ ๊ฒ์ด ์๋๋ผ ํฉ์ฑ๊ณฑ ์ธต ๋ด๋ฐ์ ์์ฉ์ฅ ์์ ์๋ ํฝ์ ์๋ง ์ฐ๊ฒฐ๋๋ค.
๋ ๋ฒ์งธ ํฉ์ฑ๊ณฑ ์ธต์ ์๋ ๊ฐ ๋ด๋ฐ์ ์ฒซ ๋ฒ์งธ ์ธต์ ์์ ์ฌ๊ฐ ์์ญ ์์ ์์นํ ๋ด๋ฐ์ ์ฐ๊ฒฐ๋๋ค.
๋คํธ์ํฌ๊ฐ ์ฒซ ๋ฒ์งธ ์๋ ์ธต์์๋ ์์ ์ ์์ค ํน์ฑ์ ์ง์คํ๊ณ , ๊ทธ๋ค์ ์๋ ์ธต์์๋ ๋ ํฐ ๊ณ ์์ค ํน์ฑ์ผ๋ก ์กฐํฉํด ๋๊ฐ๋๋ก ๋์์ค๋ค.

์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ชจ๋ ๋ค์ธต ์ ๊ฒฝ๋ง์ ์ธต์ ํ ์ค๋ก ๊ธธ๊ฒ ๋์ด์ ๋ด๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์๋ค.
-> ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ์ ๊ฒฝ๋ง์ ์ฃผ์ ํ๊ธฐ ์ ์ 1D ๋ฐฐ์ด๋ก ํผ์ณ์ผ ํ๋ค.
CNN์์๋ ๊ฐ ์ธต์ด 2D๋ก ํํ๋๋ฏ๋ก ๋ด๋ฐ์ ๊ทธ์ ์์ํ๋ ์ ๋ ฅ๊ณผ ์ฐ๊ฒฐํ๊ธฐ ๋ ์ฝ๋ค.
์ด๋ค ์ธต์ iํ, j์ด์ ์๋ ํ ๋ด๋ฐ์ ์ด์ ์ธต์ i์์ i + f_h - 1๊น์ง์ ํ๊ณผ j์์ j + f_w - 1๊น์ง์ ์ด์ ์๋ ๋ด๋ฐ์ ์ถ๋ ฅ์ ์ฐ๊ฒฐ๋๋ค.
์ฌ๊ธฐ์ f_h์ h_w๋ ์ด ์์ฉ์ฅ์ ๋์ด์ ๋๋น์ด๋ค.
์ ๋ก ํจ๋ฉ : ๋์ด์ ๋๋น๋ฅผ ์ด์ ์ธต๊ณผ ๊ฐ๊ฒ ํ๊ธฐ ์ํด ์ ๋ ฅ์ ์ฃผ์์ 0์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.

์์ฉ์ฅ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋์ด ํฐ ์ ๋ ฅ ์ธต์ ํจ์ฌ ์์ ์ธต์ ์ฐ๊ฒฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ ๊ฒ ํจ๋ ๋ชจ๋ธ์ ๊ฒ์ฐ ๋ณต์ก๋๊ฐ ํฌ๊ฒ ์ค์ด๋ ๋ค.
์คํธ๋ผ์ด๋ : ํ ์์ฉ์ฅ๊ณผ ๋ค์ ์์ฉ์ฅ ์ฌ์ด์ ์ํ ๋๋ ์์ง ๋ฐฉํฅ ์คํ ํฌ๊ธฐ
์์ ์ธต์ iํ, j์ด์ ์๋ ๋ด๋ฐ์ด ์ด์ ์ธต์ i x s_h์์ i x s_h + f_h - 1๊น์ง์ ํ๊ณผ j x s_w์์ j x s_w + f_w - 1๊น์ง์ ์ด์ ์์นํ ๋ด๋ฐ๊ณผ ์ฐ๊ฒฐ๋๋ค. (s_h์ s_w๋ ์คํธ๋ผ์ด๋์ ์์ง ๊ฐ๊ณผ ์ํ ๊ฐ์ด๋ค.)
14.2.1 ํํฐ
๋ด๋ฐ์ ๊ฐ์ค์น๋ ์์ฉ์ฅ ํฌ๊ธฐ์ ์์ ์ด๋ฏธ์ง๋ก ํํ๋ ์ ์๋ค.
ํํฐ(ํฉ์ฑ๊ณฑ ์ปค๋ ๋๋ ๊ทธ๋ฅ ์ปค๋)๋ผ ๋ถ๋ฆฌ๋ ๋ ๊ฐ์ ๊ฐ์ค์น ์ธํธ๊ฐ ์๋ค.
์) ์ฒซ ๋ฒ์งธ ํํฐ๋ ๊ฐ์ด๋ฐ ํฐ ์์ง์ ์ด ์๋ ๊ฒ์ ์ฌ๊ฐํ์ด๋ค. ์ด๋ฐ ๊ฐ์ค์น๋ฅผ ์ฌ์ฉํ ๋ด๋ฐ์ ๊ฐ์ด๋ฐ ์์ง์ ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ ์์ฉ์ฅ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํ๋ค.
๋ ๋ฒ์จฐ ํํฐ๋ ๊ฐ์ด๋ฐ ํฐ ์ํ์ ์ด ์๋ ๊ฒ์ ์ฌ๊ฐํ์ด๋ค. ์ด ๊ฐ์ค์น๋ฅผ ์ฌ์ฉํ ๋ด๋ฐ์ ๊ฐ์ด๋ฐ ์ํ์ ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ ์์ฉ์ฅ ์์ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํ๋ค.

์ธต์ ์ ์ฒด ๋ด๋ฐ์ ์ ์ฉ๋ ํ๋์ ํํฐ๋ ํ๋์ ํน์ฑ ๋งต์ ๋ง๋ ๋ค.
์ด ๋งต์ ํํฐ๋ฅผ ๊ฐ์ฅ ํฌ๊ฒ ํ์ฑํ์ํค๋ ์ด๋ฏธ์ง์ ์์ญ์ ๊ฐ์กฐํ๋ค.
์๋์ผ๋ก ํํฐ๋ฅผ ์ ์ํ ํ์๋ ์๋ค. <- ํ๋ จํ๋ ๋์ ํฉ์ฑ๊ณฑ ์ธต์ด ์๋์ผ๋ก ํด๋น ๋ฌธ์ ์ ๊ฐ์ฅ ์ ์ฉํ ํํฐ๋ฅผ ์ฐพ๊ณ ์์ ์ธต์ ์ด๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ ๋ณต์กํ ํจํด์ ํ์ตํ๋ค.
14.2.2 ์ฌ๋ฌ ๊ฐ์ง ํน์ฑ ๋งต ์๊ธฐ
์ค์ ํฉ์ฑ๊ณฑ ์ธต์ ์ฌ๋ฌ ๊ฐ์ง ํํฐ๋ฅผ ๊ฐ์ง๊ณ ํํฐ๋ง๋ค ํ๋์ ํน์ฑ ๋งต์ ์ถ๋ ฅํ๋ฏ๋ก 3D๋ก ํํํ๋ ๊ฒ์ด ๋ ์ ํํ๋ค.
๊ฐ ํน์ฑ ๋งต์ ํฝ์ ์ ํ๋์ ๋ด๋ฐ์ ํด๋นํ๊ณ ํ๋์ ํน์ฑ ๋งต ์์์๋ ๋ชจ๋ ๋ด๋ฐ์ด ๊ฐ์ ํ๋ผ๋ฏธํฐ(๋์ผํ ๊ฐ์ค์น์ ํธํฅ)๋ฅผ ๊ณต์ ํ์ง๋ง, ๋ค๋ฅธ ํน์ฑ ๋งต์ ์๋ ๋ด๋ฐ์ ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
ํ ๋ด๋ฐ์ ์์ฉ์ฅ์ ์ด์ ์ธต์ ์๋ ๋ชจ๋ ํน์ฑ ๋งต์ ๊ฑธ์ณ ํ์ฅ๋๋ค.
ํ๋์ ํฉ์ฑ๊ณฑ ์ธต์ด ์ ๋ ฅ์ ์ฌ๋ฌ ํํฐ๋ฅผ ๋์์ ์ ์ฉํ์ฌ ์ ๋ ฅ์ ์๋ ์ฌ๋ฌ ํน์ฑ์ ๊ฐ์งํ ์ ์๋ค.

ํ ํน์ฑ ๋งต์ ์๋ ๋ชจ๋ ๋ด๋ฐ์ด ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ ์ ์ฒด ํ๋ผ๋ฏธํฐ ์๊ฐ ๊ธ๊ฒฉํ๊ฒ ์ค์ด๋ ๋ค.
์ผ๋จ CNN์ด ํ ์ง์ ์์ ํจํด์ ์ธ์ํ๋๋ก ํ์ต๋์๋ค๋ฉด ์ด๋ค ์์น์ ์๋ ํจํด๋ ์ธ์ํ ์ ์๋ค.
๋ฐ๋๋ก ์์ ์ฐ๊ฒฐ ์ ๊ฒฝ๋ง์ด ํ ์ง์ ์ ์๋ ํจํด์ ์ธ์ํ๋๋ก ํ์ต๋์๋ค๋ฉด ์ค์ง ํจํด์ด ๊ทธ ์์น์ ์์ ๋๋ง ๊ฐ์งํ ์ ์๋ค.
์ ๋ ฅ ์ด๋ฏธ์ง๋ ์ปฌ๋ฌ ์ฑ๋๋ง๋ค ํ๋์ฉ ์ฌ๋ฌ ์๋ธ ์ธต์ผ๋ก ๊ตฌ์ฑ๋๊ธฐ๋ ํ๋ค.
ํฉ์ฑ๊ณฑ ์ธต l์ ์๋ k ํน์ฑ ๋งต์ iํ, j์ด์ ์์นํ ๋ด๋ฐ์ ์ด์ l - 1์ธต์ ์๋ ๋ชจ๋ ํน์ฑ ๋งต์ i x s_h์์ i x s_h + f_h - 1๊น์ง์ ํ๊ณผ j x s_w์์ j x s_w + f_w - 1๊น์ง์ ์ด์ ์๋ ๋ด๋ฐ์ ์ถ๋ ฅ์ ์ฐ๊ฒฐ๋๋ค.
๋ค๋ฅธ ํน์ฑ ๋งต์ด๋๋ผ๋ ๊ฐ์ ์ธต์ ์๋ iํ๊ณผ j์ด์ ์๋ ๋ด๋ฐ์ด๋ผ๋ฉด ์ ํํ ์ด์ ์ธต์ ์๋ ๋์ผํ ๋ด๋ฐ์ ์ถ๋ ฅ์ ์ฐ๊ฒฐ๋๋ค.
[ํฉ์ฑ๊ณฑ ์ธต์ ์๋ ๋ด๋ฐ์ ์ถ๋ ฅ ๊ณ์ฐ]

14.2.3 ์ผ๋ผ์ค๋ก ํฉ์ฑ๊ณฑ ์ธต ๊ตฌํํ๊ธฐ
from sklearn.datasets import load_sample_images import tensorflow as tf images = load_sample_images()["images"] images = tf.keras.layers.CenterCrop(height=70, width=120)(images) images = tf.keras.layers.Rescaling(scal=1 / 255)(images)load_sample_image() ํจ์๋ก ๋ช ๊ฐ์ ์ํ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ณ ์ผ๋ผ์ค CenterCrop๊ณผ Rescaling ์ธต์ผ๋ก ์ ์ฒ๋ฆฌํ๋ค.
images.shape # TensorShape([2, 70, 120, 3])์ฒซ ๋ฒ์งธ ์ฐจ์์ ๋ ๊ฐ์ ์ํ ์ด๋ฏธ์ง๊ฐ ์์์ ์ค๋ช ํ๊ณ , ๋ ๋ฒ์จฐ์ ์ธ ๋ฒ์งธ ์ฐจ์์ ๊ฐ ์ด๋ฏธ์ง๊ฐ 70 x 120 ํฌ๊ธฐ๋ผ๋ ์๋ฏธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฐ ํฝ์ ์ ์ปฌ๋ฌ ์ฑ๋๋น ํ๋์ ๊ฐ์ ๊ฐ์ง๋ค. ๋นจ๊ฐ, ์ด๋ก, ํ๋ ์ธ ๊ฐ์ ์ฑ๋์ด ์์ผ๋ฏ๋ก ๋ง์ง๋ง ์ฐจ์์ด 3์ด๋ค.
์ผ๋ผ์ค๋ COnvolution2D(Conv2D) ์ธต์ ์ ๊ณตํ๋ค. ์ด ์ธต์ ํ ์ํ๋ก์ tf.nn.conv2d() ์ฐ์ฐ์ ์ฌ์ฉใ ๋๋ค.
conv_layer = tf.keras.layers.Conv2D(filters=32, kernel_size=7) fmaps = conv_layer(images)ํฌ๊ธฐ๊ฐ 7x7์ธ ํํฐ 32๊ฐ๋ก ๊ตฌ์ฑ๋ ํฉ์ฑ๊ณฑ ์ธต์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ธต์ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ๋ ์์ ๋ฐฐ์น์ ์ ์ฉํ๋ค.
fmaps.shape # TensorShape([2, 64, 114, 32])์ถ๋ ฅ ํฌ๊ธฐ๋ ์ ๋ ฅ ํฌ๊ธฐ์ ๋น์ทํ์ง๋ง ๋ ๊ฐ์ง๊ฐ ๋ค๋ฅด๋ค.
์ฑ๋ ๊ฐ์๊ฐ 3์ด ์๋๋ผ 32์ด๋ค.(filters=32) -> 32๊ฐ์ ํน์ฑ ๋งต์ด ์ถ๋ ฅ๋์๋ค. ๊ฐ ์์น์์ ๋นจ๊ฐ, ์ด๋ก, ํ๋์ ๊ฐ๋ ๋์ ๊ฐ๊ฐ์ ํน์ฑ ๊ฐ๋๋ฅผ ์ป์๋ค.
๋์ด์ ๋๋น๋ 6ํฝ์ ์ฉ ์ค์ด๋ค์๋ค. Conv2D ์ธต์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ก ํจ๋ฉ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. -> ํํฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ถ๋ ฅ ํน์ฑ ๋งต์ ๊ฐ์ฅ์๋ฆฌ์์ ๋ช ๊ฐ์ ํฝ์ ์ ์๋๋ค.
๋์ padding="same"์ด๋ผ ์ง์ ํ๋ฉด ์ถ๋ ฅ ํน์ฑ ๋งต์ด ์ ๋ ฅ๊ณผ ๊ฐ์ ํฌ๊ธฐ๊ฐ ๋๋๋ก ์ ๋ ฅ ๊ฐ์ฅ์๋ฆฌ์ ์ถฉ๋ถํ ํจ๋ฉ์ด ์ถ๊ฐ๋๋ค.
conv_layer = tf.keras.layers.Conv2D(filters=32, kernel_size=7, ... padding="same") ... fmaps = conv_layer(images) fmaps.shape # TensorShape([2, 70, 120, 32])์คํธ๋ผ์ด๋๊ฐ 1๋ณด๋ค ํฌ๋ฉด padding="same"์ผ๋ก ์ง์ ํด๋ ์ถ๋ ฅ ํฌ๊ธฐ๊ฐ ์ ๋ ฅ ํฌ๊ธฐ์ ๊ฐ์ง ์๊ฒ ๋๋ค.

[์ถ๋ ฅ ํฌ๊ธฐ๊ฐ ๊ณ์ฐ๋๋ ๋ฐฉ์]

Dense ์ธต๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Conv2D ์ธต์ ์ปค๋๊ณผ ํธํฅ์ ํฌํจํด ๋ชจ๋ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ปค๋์ ๋๋คํ๊ฒ ์ด๊ธฐํ๋๊ณ ํธํฅ์ 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
์ด๋ฐ ๊ฐ์ค์น๋ weights ์์ฑ์ ํตํด ํ ์ํ๋ก ๋ณ์๋ get_weights() ํจ์๋ฅผ ํตํด ๋ํ์ด ๋ฐฐ์ด๋ก ์ฐธ์กฐํ ์ ์๋ค.
kernels, biases = conv_layer.get_weights() kernels.shape # (7, 7, 3, 32) biases.shape # (32,)kernels ๋ฐฐ์ด์ 4D์ด๊ณ ํฌ๊ธฐ๋ [kernel_height, kernel_width, input_channels, output_channels]์ด๋ค.
biases ๋ฐฐ์ด์ 1D์ด๊ณ ํฌ๊ธฐ๋ [output_channels]์ด๋ค.
์ถ๋ ฅ ์ฑ๋์ ๊ฐ์๋ ์ถ๋ ฅ ํน์ฑ ๋งต์ ๊ฐ์์ ๊ฐ์ผ๋ฉฐ ํํฐ์ ๊ฐ์์๋ ๊ฐ๋ค.
์ ๋ ฅ ์ด๋ฏธ์ง์ ๋์ด์ ๋๋น๊ฐ ์ปค๋ ํฌ๊ธฐ์ ๋ํ๋์ง ์๋๋ค๋ ์ ์ด ์ค์ํ๋ค.
์ถ๋ ฅ ํน์ฑ ๋งต์ ์๋ ๋ชจ๋ ๋ด๋ฐ์ด ๋์ผํ ๊ฐ์ค์น๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฏธ์ง๊ฐ ์ ์ด๋ ์ปค๋๋งํผ ํฌ๊ณ ์ฑ๋ ๊ฐ์๊ฐ ๋ง๋ค๋ฉด ์ด ์ธต์ ์ด๋ค ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ ์ ๋ ฅํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
Conv2D ์ธต์ ๋ง๋ค ๋ ์ผ๋ฐ์ ์ผ๋ก ReLU์ ๊ฐ์ ํ์ฑํ ํจ์์ He ์ด๊ธฐํ ๊ฐ์ ์ปค๋ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ค.
Dense ์ธต๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํฉ์ฑ๊ณฑ ์ธต์ ์ ํ ์ฐ์ฐ์ ์ํํ๊ธฐ ๋๋ฌธ์ ํ์ฑํ ํจ์ ์์ด ์ฌ๋ฌ ๊ฐ์ ํฉ์ฑ๊ณฑ ์ธต์ ์์๋ ํ๋์ ํฉ์ฑ๊ณฑ ์ธต๊ณผ ๋์ผํ๋ฉฐ ๋ณต์กํ ๊ฒ์ ํ์ตํ ์ ์๊ฒ ๋๋ค.
ํฉ์ฑ๊ณฑ ์ธต์๋ ์ฌ๋ฌ ๊ฐ์ ํ์ดํผํ๋ผ๋ฏธํฐ๊ฐ ์๋ค. (filters, kernel_size, padding, strides, activation, kernel_initializer ๋ฑ)
์ต์ ์ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ๊ต์ฐจ ๊ฒ์ฆ์ ์ฌ์ฉํ ์ ์์ง๋ง ์๊ฐ์ด ๋ง์ด ์์๋๋ค.
14.3 ํ๋ง ์ธต
ํ๋ง ์ธต์ ๋ชฉ์ ์ ๊ณ์ฐ๋๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๊ณผ๋์ ํฉ์ ์ํ์ ์ค์ฌ์ฃผ๋ ํ๋ผ๋ฏธํฐ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋ถํ๋ณธ(์ถ์๋ณธ)์ ๋ง๋๋ ๊ฒ์ด๋ค.
ํฉ์ฑ๊ณฑ ์ธต์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ง ์ธต์ ๊ฐ ๋ด๋ฐ์ ์ด์ ์ธต์ ์์ ์ฌ๊ฐ ์์ญ์ ์์ฉ์ฅ ์์ ์๋ ๋ด๋ฐ์ ์ถ๋ ฅ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค.
์ด์ ๊ณผ ๋์ผํ๊ฒ ํฌ๊ธฐ, ์คํธ๋ผ์ด๋, ํจ๋ฉ ์ ํ์ ์ง์ ํด์ผ ํ๋ค.
ํ์ง๋ง ํ๋ง ๋ด๋ฐ์ ๊ฐ์ค์น๊ฐ ์์ผ๋ฉฐ, ์ต๋๋ ํ๊ท ๊ฐ์ ํฉ์ฐ ํจ์๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ๊ฐ์ ๋ํ๋ ๊ฒ์ด ์ ๋ถ์ด๋ค.
์ต๋ ํ๋ง ์ธต์ ๊ฒฝ์ฐ ๊ฐ ์์ฉ์ฅ์์ ๊ฐ์ฅ ํฐ ์ ๋ ฅ๊ฐ์ด ๋ค์ ์ธต์ผ๋ก ์ ๋ฌ๋๊ณ ๋ค๋ฅธ ๊ฐ์ ๋ฒ๋ ค์ง๋ค.
๋ณดํต ๋ชจ๋ ์ ๋ ฅ ์ฑ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ฉ๋๋ฏ๋ก ์ถ๋ ฅ์ ๊น์ด(์ฑ๋ ๊ฐ์)๊ฐ ์ ๋ ฅ์ ๊น์ด์ ๋์ผํ๋ค.

์ต๋ ํ๋ง์ ์์ ๋ณํ์๋ ์ผ์ ์์ค์ ๋ถ๋ณ์ฑ์ ๋ง๋ค์ด์ค๋ค.
CNN์์ ๋ช ๊ฐ ์ธต๋ง๋ค ์ต๋ ํ๋ง ์ธต์ ์ถ๊ฐํ๋ฉด ์ ์ฒด์ ์ผ๋ก ์ผ์ ์์ค์ ์ด๋ ๋ถ๋ณ์ฑ์ ์ป์ ์ ์๋ค.
ํ์ ๊ณผ ํ๋, ์ถ์์ ๋ํด ์ฝ๊ฐ์ ๋ถ๋ณ์ฑ์ ์ ๊ณตํ๋ค.
์ด์ ๊ฐ์ ๋ถ๋ณ์ฑ์ ๋ถ๋ฅ ์์ ์ฒ๋ผ ์์ธก์ด ์ด๋ฐ ์์ ๋ถ๋ถ์์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ ์ ์ฉํ ์ ์๋ค.
ํ์ง๋ง ๋งค์ฐ ํ๊ดด์ ์ด๋ผ๋ ๋จ์ ์ด ์๋ค.
14.4 ์ผ๋ผ์ค๋ก ํ๋ง ์ธต ๊ตฌํํ๊ธฐ
max_pool = tf.keras.layers.MaxPool2D(pool_size=2)์คํธ๋ผ์ด๋์ ๊ธฐ๋ณธ๊ฐ์ ์ปค๋ ํฌ๊ธฐ์ด๋ฏ๋ก ์ด ์ธต์ (์ํ๊ณผ ์์ง ๋ชจ๋) ์คํธ๋ผ์ด๋ 2๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก "valid" ํจ๋ฉ์ ์ฌ์ฉํ๋ค. (ํจ๋ฉ์ ํ์ง ์๋๋ค.)
ํ๊ท ํ๋ง ์ธต์ ๋ง๋๋ ค๋ฉด MaxPool2D ๋์ AveragePooling2D(AvgPool2D)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
ํ๊ท ์ ๊ฒ์ฐํ๋ฉด ์ต๋๊ฐ์ ๊ณ์ฐํ๋ ๊ฒ๋ณด๋ค ์ ๋ณด ์์ค์ด ์ ์ง๋ง, ์ต๋ ํ๋ง์ ๋ค์ ์ธต์ด ์กฐ๊ธ ๋ ๋ช ํํ ์ ํธ๋ก ์์ ํ ์ ์์ผ๋ฉฐ ๊ฐ๋ ฅํ ์ด๋ ๋ถ๋ณ์ฑ์ ์ ๊ณตํ๊ณ ์ฐ์ฐ ๋น์ฉ์ด ์กฐ๊ธ ๋ ๋ ๋ค.
์ต๋ ํ๋ง๊ณผ ํ๊ท ํ๋ง์ ๊ณต๊ฐ ์ฐจ์ฐ๋์ด ์๋๋ผ ๊น์ด ์ฐจ์์ผ๋ก ์ํ๋ ์ ์๋ค.
-> CNN์ด ๋ค์ํ ํน์ฑ(๋๊ป, ๋ฐ๊ธฐ, ์๊ณก, ์์ ๋ฑ)์ ๋ํ ๋ถ๋ณ์ฑ์ ํ์ตํ ์ ์๋ค.
[๊น์ด ๋ฐฉํฅ ์ต๋ ํ๋ง]

ํ์ ์ ๋ํ ๋ถ๋ณ์ฑ์ ํ์ตํ ์ ์๋ค. class DepthPool(tf.keras.layers.Layer): def __init__(self, pool_size=2, **kwargs): super().__init__(**kwargs) self.pool_size = pool_size def call(self, inputs): shape = tf.shape(inputs) # shape[-1]์ ์ฑ๋ ๊ฐ์์ด๋ค. groups = shape[-1] // self.pool_size # ์ฑ๋ ๊ทธ๋ฃน์ ๊ฐ์ new_shape = tf.concat([shape[:-1], [groups, self.pool_size]], axis=0) return tf.reduce_max(tf.reshape(inputs, new_shape), axis=-1)์ ๋ ฅ์ ์ฑ๋์ ์ํ๋ ํฌ๊ธฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ค. ๊ทธ๋ค์ tf.reduce_max()๋ฅผ ์ฌ์ฉํด ๊ฐ ๊ทธ๋ฃน์ ์ต๋๊ฐ์ ๊ณ์ฐํ๋ค.
์คํธ๋ผ์ด๋๊ฐ ํ๋ง ํฌ๊ธฐ์ ๊ฐ๋ค๊ณ ๊ฐ์ ํ๋ ์ฝ๋์ด๋ค.
ํ๋์ ์ธ ์ ๊ฒฝ๋ง ๊ตฌ์กฐ์์ ์ข ์ข ๋ณด๊ฒ๋ ๋ง์ง๋ง ํ๋ง ์ธต์ ์ ์ญ ํ๊ท ํ๋ง ์ธต์ด๋ค.
์ด ์ธต์์๋ ๊ฐ ํน์ฑ ๋งต์ ํ๊ท ์ ๊ณ์ฐํ๋ค. (์ ๋ ฅ๊ณผ ๊ณต๊ฐ ๋ฐฉํฅ ์ฐจ์์ด ๊ฐ์ ์ปค๋์ ์ฌ์ฉํ๋ ํ๋ง ์ธต๊ณผ ๊ฐ๋ค.)
๊ฐ ์ํ์ ํน์ฑ ๋งต๋ง๋ค ํ๋์ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค.
GlobalAveeragePooling2D(GlobalAvgPool2D) ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
global_avg_pool = tf.keras.layers.GlobalAvgPool2D()global_avg_pool = tf.keras.layers.Lambda( lambda X: tf.reduce_mean(X, axis=[1, 2]))๊ณต๊ฐ ๋ฐฉํฅ(๋์ด์ ๋๋น)์ ๋ฐ๋ผ ํ๊ท ์ ๊ณ์ฐํ๋ Lambda ์ธต๊ณผ ๋๋ฑํ๋ค.
global_avg_pool(images_ # <tf.Tensor: shape=(2, 3), dtype=float32, numpy= # array([[0.64338624, 0.5971759, 0.5824972 ], # [0.76306933, 0.26011038, 0.10849128]], dtype=float32)>์ด ์ธต์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ์ ์ฉํ๋ฉด ๊ฐ ์ด๋ฏธ์ง์ ๋นจ๊ฐ, ์ด๋ก, ํ๋ ์์ ํ๊ท ๊ฐ๋๋ฅผ ์ป์ ์ ์๋ค.
14.5 CNN ๊ตฌ์กฐ
์ ํ์ ์ธ CNN ๊ตฌ์กฐ๋ ํฉ์ฑ๊ณฑ ์ธต์ ๋ช ๊ฐ ์๊ณ (๊ฐ๊ฐ ReLU ์ธต์ ๊ทธ ๋ค์ ๋๊ณ ), ๊ทธ๋ค์์ ํ๋ง ์ธต์ ์๊ณ , ๊ทธ๋ค์์ ๋ ํฉ์ฑ๊ณฑ ์ธต(+ReLU)์ ๋ช ๊ฐ ๋ ์๊ณ , ๊ทธ๋ค์์ ๋ค์ ํ๋ง ์ธต์ ์๋ ์์ด๋ค.
๋คํธ์ํฌ๋ฅผ ํต๊ณผํ์ฌ ์งํํ ์๋ก ์ด๋ฏธ์ง๋ ์ ์ ์์์ง์ง๋ง ํฉ์ฑ๊ณฑ ์ธต ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ ๋ ๊น์ด์ง๋ค. (๋ ๋ง์ ํน์ฑ ๋งต์ ๊ฐ์ง๋ค.)
๋งจ ์์ธต์๋ ๋ช ๊ฐ์ ์์ ์ฐ๊ฒฐ ์ธต(+ReLU)์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํผ๋ํฌ์๋ ์ ๊ฒฝ๋ง์ด ์ถ๊ฐ๋๊ณ ๋ง์ง๋ง ์ธต(ํด๋์ค ํ๋ฅ ์ ์ถ์ ํ๊ธฐ ์ํ ์ํํธ๋งฅ์ค ์ธต)์์ ์์ธก์ ์ถ๋ ฅํ๋ค.

from functools import partial DefaultConv2D = partial(tf.keras.layers.Conv2D, kernel_size=3, padding="same", activation="relu", kernel_initializer="he_normal") model = tf.keras.Sequential([ DefaultConv2D(filters=64, kernel_size=7, input_shape=[28, 28, 1]), tf.keras.layers.MaxPool2D(), DefualtConv2D(filters=128), DefualtConv2D(filters=128), tf.keras.layers.MaxPool2D(), DefualtConv2D(filters=256), DefualtConv2D(filters=256), tf.keras.layers.MaxPool2D(), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=128, activation="relu", kernel_initializer="he_normal"), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(units=64, activation="relu", kernel_initializer="he_normal"), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(units=10, activation="softmax") ])functools.partial() ํจ์๋ฅผ ์ฌ์ฉํด Conv2D์ ๊ฐ์ง๋ง ๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์ ๊ฐ์ด ๋ค๋ฅธ DefaultConv2D๋ฅผ ์ ์ํ๋ค. ์ปค๋ ํฌ๊ธฐ๋ 3์ด๊ณ "same" ํจ๋ฉ, RELU ํ์ฑํ ํจ์, He ์ด๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ค.
Sequential ๋ชจ๋ธ์ ๋ง๋ ๋ค. ์ฒซ ๋ฒ์จฐ ์ธต์ 7x7์ ํํฐ 64๊ฐ๋ฅผ ๊ฐ์ง DefaultConv2D์ด๋ค. ์ ๋ ฅ ์ด๋ฏธ์ง๊ฐ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ์คํธ๋ผ์ด๋ ๊ธฐ๋ณธ๊ฐ 1์ ์ฌ์ฉํ๋ค. ์ด๋ฏธ์ง๊ฐ 28x28 ํฝ์ ์ด๊ณ ์ปฌ๋ฌ ์ฑ๋์ด ํ๋ฐฑ ํ๋์ด๋ฏ๋ก input_shape=[28, 28, 1]๋ก ์ง์ ํ๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฑ๋ ์ฐจ์์ ์ถ๊ฐํ๊ธฐ ์ํด np.reshape() ๋๋ np.expand_dims()๋ฅผ ์ฌ์ฉํด์ผ ํ ์๋ ์๊ณ , ๋ชจ๋ธ์ ์ฒซ ๋ฒ์งธ ์ธต์ผ๋ก Reshape ์ธต์ ์ฌ์ฉํ ์ ์๋ค.
ํ๋ง ํฌ๊ธฐ๊ฐ 2์ธ ์ต๋ ํ๋ง ์ธต์ ์ถ๊ฐํ์ฌ ๊ณต๊ฐ ๋ฐฉํฅ ์ฐจ์์ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค.
์ด์ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๋ ๋ฒ ๋ฐ๋ณตํ๋ค. ์ต๋ ํ๋ง ์ธต์ด ๋ค๋ฐ๋ฅด๋ ํฉ์ฑ๊ณฑ ์ธต์ด ๋ ๋ฒ ๋ฑ์ฅํ๋ค. ์ด๋ฏธ์ง๊ฐ ํด ๋๋ ์ด ๊ตฌ์กฐ๋ฅผ ๋ ๋ง์ด ๋ฐ๋ณตํ ์ ์๋ค. ๋ฐ๋ณต ํ์๋ ํ๋ํด์ผ ํ ํ์ดํผํ๋ผ๋ฏธํฐ์ด๋ค.
CNN์ด ์ถ๋ ฅ ์ธต์ ๋ค๋ค๋ฅผ์๋ก ํํฐ ๊ฐ์๊ฐ ๋์ด๋๋ค. ์ ์์ค ํน์ฑ์ ๊ฐ์๋ ์ ์ง๋ง ์ด๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ณ ์์ค ํน์ฑ์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ํฉ๋ฆฌ์ ์ด๋ค. ํ๋ง ์ธต ๋ค์์ ํํฐ ๊ฐ์๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ํ๋ง ์ธต์ด ๊ณต๊ฐ ๋ฐฉํฅ ์ฐจ์์ ์ ๋ฐ์ผ๋ก ์ค์ด๋ฏ๋ก ์ด์ด์ง๋ ์ธต์์ ํ๋ผ๋ฏธํฐ ๊ฐ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๊ณ์ฐ ๋น์ฉ์ ํฌ๊ฒ ๋๋ฆฌ์ง ์๊ณ ํน์ฑ ๋งต ๊ฐ์๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆด ์ ์๋ค.
๋ ๊ฐ์ ์๋ ์ธต๊ณผ ํ๋์ ์ถ๋ ฅ ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์์ ์ฐ๊ฒฐ ๋คํธ์ํฌ์ด๋ค. ๋ฐ์ง ์ธต์ ์ํ์ ํน์ฑ์ผ๋ก 1D ๋ฐฐ์ด์ ๊ธฐ๋ํ๋ฏ๋ก ์ฒซ ๋ฒ์งธ ๋ฐ์ง ์ธต ์ด์ ์ ์ ๋ ฅ์ ์ผ๋ ฌ๋ก ํผ์ณ์ผ ํ๋ค. ๋ ๊ณผ๋์ ํฉ์ ์ค์ด๊ธฐ ์ํด ๋ฐ์ง ์ธต ์ฌ์ด์ 50%์ ๋๋กญ์์ ๋น์จ์ ๊ฐ์ง ๋๋กญ์์ ์ธต์ ์ถ๊ฐํ๋ค.
14.5.1 LeNet-5

ํฉ์ฑ๊ณฑ ์ธต๊ณผ ํ๋ง ์ธต์ ์๊ณ ๋ฐ์ง ์ธต์ด ๋ค๋ฐ๋ฅธ๋ค.
์ต์ ๋ถ๋ฅ CNN๊ณผ ๊ฐ์ฅ ํฌ๊ฒ ์ฐจ์ด๋๋ ์ ์ ํ์ฑํ ํจ์์ด๋ฉฐ ์์ฆ์๋ tanh ๋์ ReLU๋ฅผ ์ฌ์ฉํ๊ณ RBF ๋์ ์ํํธ๋งฅ์ค๋ฅผ ์ฌ์ฉํ๋ค.
14.5.2 AlexNet

๋ ํฌ๊ณ ๊น์ ๋ฟ LeNet-5์ ๋น์ทํ๋ฉฐ, ์ฒ์์ผ๋ก ํฉ์ฑ๊ณฑ ์ธต ์์ ํ๋ง ์ธต์ ์์ง ์๊ณ ๋ฐ๋ก ํฉ์ฑ๊ณฑ ์ธต๋ผ๋ฆฌ ์์๋ค.
๊ณผ๋์ ํฉ์ ์ค์ด๊ธฐ ์ํด ๋ ๊ฐ์ง ๊ท์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ๋ ํ๋ จํ๋ ๋์ F9๊ณผ F10์ ์ถ๋ ฅ์ ๋๋กญ์์์ 50% ๋น์จ๋ก ์ ์ฉํ๋ค.
๋ ๋ฒ์งธ๋ ํ๋ จ ์ด๋ฏธ์ง๋ฅผ ๋๋คํ๊ฒ ์ฌ๋ฌ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ํ๊ฑฐ๋ ์ํ์ผ๋ก ๋ค์ง๊ณ ์กฐ๋ช ์ ๋ฐ๊พธ๋ ์์ผ๋ก ๋ฐ์ดํฐ ์ฆ์์ ์ํํ๋ค.
๋ฐ์ดํฐ ์ฆ์ : ์ง์ง ๊ฐ์ ํ๋ จ ์ํ์ ์ธ๊ณต์ ์ผ๋ก ์์ฑํ์ฌ ํ๋ จ ์ธํธ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค. ๊ณผ๋์ ํฉ์ ์ค์ด๋ ๊ท์ ๊ธฐ๋ฒ์ด๋ค.
์์ฑ๋ ์ํ์ ๊ฐ๋ฅํ ์ง์ง์ ๊ฐ๊น์์ผ ํ๋ค.
์ด์์ ์ผ๋ก๋ ์ฆ์๋ ํ๋ จ ์ธํธ์์ ์ด๋ฏธ์ง๋ฅผ ๋ฝ์์ ๋ ์ฆ์๋ ๊ฒ์ธ์ง ์๋์ง๋ฅผ ๊ตฌ๋ถํ ์ ์์ด์ผ ํ๋ค.
๋จ์ํ ๋ฐฑ์ ์ก์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋์์ด ๋์ง ์์ผ๋ฉฐ ์ฆ์ ๋ฐฉ์์ด ํ์ต ๊ฐ๋ฅํด์ผ ํ๋ค.
ํด๋์ค ๋น๋๊ฐ ์์ ์ํ์ ๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ท ํํ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃฐ ๋๋ ์ ์ฉํ๋ค. (SMOTE)
AlexNet์ C1๊ณผ C3 ์ธต์ ReLU ๋จ๊ณ ํ์ ๋ฐ๋ก LRN(local response normalization)์ด๋ผ ๋ถ๋ฅด๋ ๊ฒฝ์์ ์ธ ์ ๊ทํ ๋จ๊ณ๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ์ฅ ๊ฐํ๊ฒ ํ์ฑํ๋ ๋ด๋ฐ์ด ๋ค๋ฅธ ํน์ฑ ๋งต์ ์๋ ๊ฐ์ ์์น์ ๋ด๋ฐ์ ์ต์ ํ๋ค.
์ด๋ ํน์ฑ ๋งต์ ๊ฐ๊ธฐ ํน๋ณํ๊ฒ ๋ค๋ฅธ ๊ฒ๊ณผ ๊ตฌ๋ถ๋๊ฒ ํ๊ณ , ๋ ๋์ ์๊ฐ์์ ํน์ง์ ํ์ํ๋๋ก ๋ง๋ค์ด ๊ฒฐ๊ตญ ์ผ๋ฐํ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.


14.5.3 GoogLeNet
๋คํธ์ํฌ๊ฐ ์ด์ CNN๋ณด๋ค ํจ์ฌ ๋ ๊น๋ค.
์ธ์ ์ ๋ชจ๋์ด๋ผ๋ ์๋ธ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ GoogLeNet์ด ์ด์ ์ ๊ตฌ์กฐ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
[์ธ์ ์ ๋ชจ๋์ ๊ตฌ์กฐ]

3x3+1(s) ํ์๋ 3x3 ์ปค๋, ์คํธ๋ผ์ด๋ 1, "same" ํจ๋ฉ์ ์ฌ์ฉํ๋ค๋ ๋ป์ด๋ค.
์ฒ์์ ์ ๋ ฅ ์ ํธ๊ฐ ๋ค ๊ฐ์ ๋ค๋ฅธ ์ธต์ ์ฃผ์ ๋๋ฉฐ ๋ชจ๋ ํฉ์ฑ๊ณฑ ์ธต์ ReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์์ชฝ์ ํฉ์ฑ๊ณฑ ์ธต์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ปค๋ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํฌ๊ธฐ์ ํจํด์ ์ก๋๋ค.
๋ชจ๋ ์ธต์(์ต๋ ํ๋ง ์ธต์กฐ์ฐจ๋) ์คํธ๋ผ์ด๋ 1๊ณผ "same" ํจ๋ฉ์ ์ฌ์ฉํ๋ฏ๋ก ์ถ๋ ฅ์ ๋์ด์ ๋๋น๊ฐ ๋ชจ๋ ์ ๋ ฅ๊ณผ ๊ฐ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์ถ๋ ฅ์ ๊น์ด ์ฐ๊ฒฐ ์ธต์์ ๊น์ด ๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐํ ์ ์๋ค. (== ์์ชฝ ๋ค ๊ฐ์ ํฉ์ฑ๊ณฑ ์ธต์์ ๋ง๋ ํน์ฑ ๋งต์ ์๋๋ค.)
์ด ์ธต์ ์ผ๋ผ์ค ๊ธฐ๋ณธ๊ฐ axis=-1๋ก ์ง์ ํ Concatenate ์ธต์ ์ฌ์ฉํด ๊ตฌํํ ์ ์๋ค.
์ธ์ ์ ๋ชจ๋์ 1x1 ์ปค๋์ ํฉ์ฑ๊ณฑ ์ธต์ ๊ฐ์ง๋ค.
๊ณต๊ฐ์์ ํจํด์ ์ก์ ์๋ ์์ง๋ง ๊น์ด ์ฐจ์(์ฑ๋)์ ๋ฐ๋ผ ๋์ธ ํจํด์ ์ก์ ์ ์๋ค.
์ ๋ ฅ๋ณด๋ค ๋ ์ ์ ํน์ฑ ๋งต์ ์ถ๋ ฅํ๋ฏ๋ก ์ฐจ์์ ์ค์ธ๋ค๋ ์๋ฏธ์ธ ๋ณ๋ชฉ ์ธต์ ์ญํ ์ ๋ด๋นํ๋ค. ์ฐ์ฐ ๋น์ฉ๊ณผ ํ๋ผ๋ฏธํฐ ๊ฐ์๋ฅผ ์ค์ฌ ํ๋ จ ์๋๋ฅผ ๋์ด๊ณ ์ผ๋ฐํ ์ฑ๋ฅ์ ํฅ์ํ๋ค.
ํฉ์ฑ๊ณฑ ์ธต์ ์์ด ๋ ๋ณต์กํ ํจํด์ ๊ฐ์งํ ์ ์๋ ํ ๊ฐ์ ๊ฐ๋ ฅํ ํฉ์ฑ๊ณฑ ์ธต์ฒ๋ผ ์๋ํ๋ค. ํ๋์ ํฉ์ฑ๊ณฑ ์ธต์ ํ๋์ ๋ฐ์ง ์ธต์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ํ๋ ๊ฒ๊ณผ ๊ฐ๊ณ ํฉ์ฑ๊ณฑ ์ธต์ ์์ ๋ ๊ฐ์ ์ธต์ ๊ฐ์ง ์ ๊ฒฝ๋ง์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ธ์ ์ ๋ชจ๋์ ์ฌ๋ฌ ํฌ๊ธฐ์ ๋ณต์กํ ํจํด์ด ๋ด๊ธด ํน์ฑ ๋งต์ ์ถ๋ ฅํ๋ ํฉ์ฑ๊ณฑ ์ธต์ด๋ค.
GoogLeNet์ ์ค์ ๋ก ๋คํธ์ํฌ๋ฅผ ํ๋๋ก ๊ธธ๊ฒ ์์ ๊ตฌ์กฐ์ด๊ณ , 9๊ฐ์ ์ธ์ ์ ๋ชจ๋์ ํฌํจํ๊ณ ์๋ค.
์ธ์ ์ ๋ชจ๋์ ์๋ ์ฌ์ฏ ๊ฐ์ ์ซ์๋ ๋ชจ๋ ์์ ์๋ ํฉ์ฑ๊ณฑ ์ธต์์ ์ถ๋ ฅํ๋ ํน์ฑ ๋งต์ ์๋ฅผ ๋ํ๋ธ๋ค.
๋ชจ๋ ํฉ์ฑ๊ณฑ ์ธต์ ReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.

์ฒ์ ๋ ์ธต์ ๊ณ์ฐ๋์ ์ค์ด๊ธฐ ์ํด ์ด๋ฏธ์ง์ ๋์ด์ ๋๋น๋ฅผ 4๋ฐฐ๋ก ์ค์ธ๋ค. (๋ฉด์ ์ 16๋ฐฐ ์ค์ด๋ ๋ค.) ๋ง์ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฒซ ๋ฒ์จฐ ์ธต์ ํฐ ํฌ๊ธฐ์ ์ปค๋(7x7)์ ์ฌ์ฉํ๋ค.
LRN ์ธต์ ์ด์ ์ธต์ด ๋ค์ํ ํน์ฑ์ ํ์ตํ๋๋ก ๋ง๋ ๋ค.
์ด์ด์ง๋ ๋ ๊ฐ์ ํ์ฑ๊ณฑ ์ธต ์ค์์ ์ฒซ ๋ฒ์งธ ์ธต์ด ๋ณ๋ชฉ ์ธต์ฒ๋ผ ์๋ํ๋ค. ์ด ํฉ์ฑ๊ณฑ ์์ ํ๋์ ๋๋ํ ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ์๊ฐํ ์ ์๋ค.
๋ค์ ํ๋ฒ LRN ์ธต์ด ์ด์ ์ธต์ด ๋ค์ํ ํจํด์ ํ์ตํ๋๋ก ๋ง๋ ๋ค.
๊ทธ๋ฐ ๋ค์ ์ต๋ ํ๋ง ์ธต์ด ๊ณ์ฐ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ด๋ฏธ์ง์ ๋์ด์ ๋๋น๋ฅผ 2๋ฐฐ๋ก ์ค์ธ๋ค.
9๊ฐ์ ์ธ์ ์ ๋ชจ๋์ด ๊ธธ๊ฒ ์ด์ด์ง๊ณ , ์ฐจ์ ๊ฐ์์ ์๋ ํฅ์์ ์ํด ๋ช ๊ฐ์ ์ต๋ ํ๋ง ์ธต์ ๋ผ์๋ฃ์๋ค.
์ ์ญ ํ๊ท ํ๋ง ์ธต์ด ๊ฐ ํน์ฑ ๋งต์ ํ๊ท ์ ์ถ๋ ฅํ๋ค. ๋จ์ ์๋ ๊ณต๊ฐ ์ ๋ณด๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ ๊ณต๊ฐ ๋ฐฉํฅ ์ ๋ณด๋ฅผ ๋ชจ๋ ์๋๋ค. ์ด ์ธต์์ ์ํ๋ ์ฐจ์ ์ถ์ ๋๋ถ์ CNN ์์ ๋ช ๊ฐ์ ์์ ์ฐ๊ฒฐ ์ธต์ ๋ ํ์๊ฐ ์๋ค.
๊ท์ ๋ฅผ ์ํ ๋๋กญ์์ ์ธต ๋ค์์ 1,000๊ฐ์ ์ ๋๊ณผ ์ํํธ๋งฅ์ค ํ์ฑํ ํจ์๋ฅผ ์ ์ฉํ ์์ ์ฐ๊ฒฐ ์ธต์ผ๋ก ํด๋์ค ํ๋ฅ ์ถ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
์๋ณธ GoogLeNet ๊ตฌ์กฐ๋ ์ธ ๋ฒ์งธ์ ์ฌ์ฏ ๋ฒ์งธ ์ธ์ ์ ๋ชจ๋ ์์ ์ฐ๊ฒฐ๋ ๋ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ๋ถ๋ฅ๊ธฐ๋ฅผ ํฌํจํ๋ค.
์ด๋ค์ ๋ชจ๋ ํ๋์ ํ๊ท ํ๋ง ์ธต, ํ๋์ ํฉ์ฑ๊ณฑ ์ธต, ๋ ๊ฐ์ ์์ ์ฐ๊ฒฐ ์ธต, ์ํํธ๋งฅ์ค ํ์ฑํ ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
ํ๋ จํ๋ ๋์ ์ฌ๊ธฐ์์์ ์์ค์ด ์ ์ฒด ์์ค์ ๋ํด์ง๋ค.
-> ๊ทธ๋ ์ด๋์ธํธ ์์ค ๋ฌธ์ ๋ฅผ ์ค์ด๊ณ ๋คํธ์ํฌ๋ฅผ ๊ท์ ํ๋ ํจ๊ณผ๊ฐ ๋น๊ต์ ์๋ค.
14.5.4 VGGNet
2๊ฐ ๋๋ 3๊ฐ์ ํฉ์ฑ๊ณฑ ์ธต ๋ค์ ํ๋ง ์ธต์ด ๋์ค๊ณ ๋ค์ 2๊ฐ ๋๋ 3๊ฐ์ ํฉ์ฑ๊ณฑ ์ธต๊ณผ ํ๋ง ์ธต์ด ๋ฑ์ฅํ๋ค.
๋ง์ง๋ง ๋ฐ์ง ๋คํธ์ํฌ๋ 2๊ฐ์ ์๋ ์ธต๊ณผ ์ถ๋ ฅ ์ธต์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
๋ง์ ๊ฐ์์ ํํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง 3x3 ํํฐ๋ง ์ฌ์ฉํ๋ค.
14.5.5 ResNet (์์ฐจ ๋คํธ์ํฌ)
152๊ฐ์ ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ๊ทน๋๋ก ๊น์ CNN์ ์ฌ์ฉํ๋ค.
๋ ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ์ ์ ๋ ๊น์ ๋คํธ์ํฌ๋ก ์ปดํจํฐ ๋น์ ๋ชจ๋ธ์ ๊ตฌ์ฑํ๋ ์ผ๋ฐ์ ์ธ ํธ๋ ๋๋ฅผ ๋ง๋ค์๋ค.
์ด๋ฐ ๊น์ ๋คํธ์ํฌ๋ฅผ ํ๋ จ์ํฌ ์ ์๋ ํต์ฌ ์์๋ ์คํต ์ฐ๊ฒฐ(์์ปท ์ฐ๊ฒฐ)์ด๋ค.
์ด๋ค ์ธต์ ์ฃผ์ ๋๋ ์ ํธ๊ฐ ์์ ์ธต์ ์ถ๋ ฅ์๋ ๋ํด์ง๋ค.
์ ๊ฒฝ๋ง์ ํ๋ จ์ํฌ ๋๋ ๋ชฉ์ ํจ์ h(x)๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
๋ง์ฝ ์ ๋ ฅ x๋ฅผ ๋คํธ์ํฌ์ ์ถ๋ ฅ์ ๋ํ๋ค๋ฉด(์คํต ์ฐ๊ฒฐ์ ์ถ๊ฐํ๋ฉด) ๋คํธ์ํฌ๋ h(x) ๋์ f(x) - h(x) - x๋ฅผ ํ์ตํ๊ฒ ๋๋ค. (์์ฐจ ํ์ต)

์ผ๋ฐ์ ์ธ ์ ๊ฒฝ๋ง์ ์ด๊ธฐํํ ๋๋ ๊ฐ์ค์น๊ฐ 0์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ๋ 0์ ๊ฐ๊น์ด ๊ฐ์ ์ถ๋ ฅํ๋ค.
์คํต ์ฐ๊ฒฐ์ ์ถ๊ฐํ๋ฉด ์ด ๋คํธ์ํฌ๋ ์ ๋ ฅ๊ณผ ๊ฐ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
์ฆ, ์ด๊ธฐ์๋ ํญ๋ฑ ํจ์๋ฅผ ๋ชจ๋ธ๋งํ๋ค.
๋ชฉ์ ํจ์๊ฐ ํญ๋ฑ ํจ์์ ๋งค์ฐ ๊ฐ๊น๋ค๋ฉด ํ๋ จ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง๋ค.
์คํต ์ฐ๊ฒฐ์ ๋ง์ด ์ถ๊ฐํ๋ฉด ์ผ๋ถ ์ธต์ด ์์ง ํ์ต๋์ง ์์๋๋ผ๋ ๋คํธ์ํฌ๋ ํ๋ จ์ ์์ํ ์ ์๋ค.
์คํต ์ฐ๊ฒฐ ๋๋ถ์ ์ ๋ ฅ ์ ํธ๊ฐ ์ ์ฒด ๋คํธ์ํฌ์ ์์ฝ๊ฒ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค.
์ฌ์ธต ์์ฐจ ๋คํธ์ํฌ๋ ์คํต ์ฐ๊ฒฐ์ ๊ฐ์ง ์์ ์ ๊ฒฝ๋ง์ธ ์์ฐจ ์ ๋(RU)์ ์์ ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
[์ผ๋ฐ์ ์ธ ์ฌ์ธต ์ ๊ฒฝ๋ง(์ผ์ชฝ)๊ณผ ์ฌ์ธต ์์ฐจ ๋คํธ์ํฌ(์ค๋ฅธ์ชฝ)]

ResNet์ GoogLeNet๊ณผ ๋๊ฐ์ด ์์ํ๊ณ ์ข ๋ฃํ์ง๋ง, ์ค๊ฐ์ ๋จ์ํ ์์ฐจ ์ ๋์ ๋งค์ฐ ๊น๊ฒ ์๋๋ค.
๊ฐ ์์ฐจ ์ ๋์ ๋ฐฐ์น ์ ๊ทํ(BN)์ ReLU, 3x3 ์ปค๋์ ์ฌ์ฉํ๊ณ ๊ณต๊ฐ ์ ๋ณด๋ฅผ ์ ์งํ๋(์คํธ๋ผ์ด๋ 1, "same" ํจ๋ฉ) ๋ ๊ฐ์ ํฉ์ฑ๊ณฑ ์ธต(ํ๋ง ์ธต์ด ์๋ค)๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.

ํน์ฑ ๋งต์ ์๋ ๋ช ๊ฐ์ ์์ฐจ ์ ๋๋ง๋ค ๋ ๋ฐฐ๋ก ๋์ด๋๊ณ (์คํธ๋ผ์ด๋ 2์ธ ํฉ์ฑ๊ณฑ ์ธต์ ์ฌ์ฉํด์) ๋์ด์ ๋๋น๋ ์ ๋ฐ์ด ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ์ด ์์ฐจ ์ ๋์ ์ถ๋ ฅ์ ๋ฐ๋ก ๋ํด์ง ์ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์คํธ๋ผ์ด๋ 2์ด๊ณ ์ถ๋ ฅ ํน์ฑ ๋งต์ ์๊ฐ ๊ฐ์ 1x1 ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ์ ๋ ฅ์ ํต๊ณผ์ํจ๋ค.
[ํน์ฑ ๋งต์ ํฌ๊ธฐ์ ๊น์ด๊ฐ ๋ฐ๋ ๋ ์คํต ์ฐ๊ฒฐ]

14.5.6 Xception
GoogLeNet๊ณผ ResNet์ ์์ด๋์ด๋ฅผ ํฉ์ณค์ง๋ง ์ธ์ ์ ๋ชจ๋์ ๊น์ด๋ณ ๋ถ๋ฅ ํฉ์ฑ๊ณฑ ์ธต(๋ถ๋ฆฌ ํฉ์ฑ๊ณฑ ์ธต)์ด๋ผ๋ ํน๋ณํ ์ธต์ผ๋ก ๋์ฒดํ๋ค.
์ผ๋ฐ์ ์ธ ํฉ์ฑ๊ณฑ ์ธต์ ๊ณต๊ฐ์์ ํจํด(์. ํ์ ํํ)๊ณผ ์ฑ๋ ์ฌ์ด์ ํจํด(์. ์ +์ฝ+๋=์ผ๊ตด)์ ๋์์ ์ก๊ธฐ ์ํด ํํฐ๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ฉด ๋ถ๋ฆฌ ํฉ์ฑ๊ณฑ ์ธต์ ๊ณต๊ฐ ํจํด๊ณผ ์ฑ๋ ์ฌ์ด ํจํด์ ๋ถ๋ฆฌํ์ฌ ๋ชจ๋ธ๋งํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์ด ์ธต์ ๋ ๊ฐ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฒซ ๋ฒ์จฐ ๋ถ๋ถ์ ํ๋์ ๊ณต๊ฐ ํํฐ๋ฅผ ๊ฐ ์ ๋ ฅ ํน์ฑ ๋งต์ ์ ์ฉํ๊ณ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ์ฑ๋ ์ฌ์ด ํจํด๋ง ์กฐ์ฌํ๋ค. (1x1 ํํฐ๋ฅผ ์ฌ์ฉํ ์ผ๋ฐ์ ์ธ ํฉ์ฑ๊ณฑ ์ธต)

๋ถ๋ฆฌ ํฉ์ฑ๊ณฑ ์ธต์ ์ ๋ ฅ ์ฑ๋๋ง๋ค ํ๋์ ๊ณต๊ฐ ํํฐ๋ง ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ ์ธต๊ณผ ๊ฐ์ด ์ฑ๋์ด ๋๋ฌด ์ ์ ์ธต ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์ ํผํด์ผ ํ๋ค.
-> Xception ๊ตฌ์กฐ๋ 2๊ฐ์ ์ผ๋ฐ ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ์์ํ๋ค.
์ด ๊ตฌ์กฐ์ ๋๋จธ์ง๋ ๋ถ๋ฆฌ ํฉ์ฑ๊ณฑ๋ง ์ฌ์ฉํ๋ฉฐ, ๊ฑฐ๊ธฐ์ ๋ช ๊ฐ์ ์ต๋ ํ๋ง ์ธต๊ณผ ์ ํ์ ์ธ ๋ง์ง๋ง ์ธต๋ค(์ ์ญ ํ๊ท ํ๋ง ์ธต๊ณผ ๋ฐ์ง ์ถ๋ ฅ ์ธต)์ ์ฌ์ฉํ๋ค.
์ธ์ ์ ๋ชจ๋์ด ์ ํ ์๋๋ฐ Xception์ GooLeNet์ ๋ณํ์ผ๋ก ๊ฐ์ฃผํ๋ ์ด์ :
์ธ์ ์ ๋ชจ๋์ 1x1 ํํฐ๋ฅผ ์ฌ์ฉํ ํฉ์ฑ๊ณฑ ์ธต์ ํฌํจํ๋ฉฐ ์ด ์ธต์ ์ฑ๋ ์ฌ์ด ํจํด๋ง ๊ฐ์งํ๋ค.
ํ์ง๋ง ์ด ์์ ๋์ธ ํฉ์ฑ๊ณฑ ์ธต์ ๊ณต๊ฐ๊ณผ ์ฑ๋ ํจํด์ ๋ชจ๋ ๊ฐ์งํ๋ ์ผ๋ฐ์ ์ธ ํฉ์ฑ๊ณฑ ์ธต์ด๋ค.
๋ฐ๋ผ์ ์ธ์ ์ ๋ชจ๋์ (๊ณต๊ฐ ํจํด๊ณผ ์ฑ๋ ํจํด์ ํจ๊ป ๊ณ ๋ คํ๋) ์ผ๋ฐ ํฉ์ฑ๊ณฑ ์ธต๊ณผ (๋ฐ๋ก ๊ณ ๋ คํ๋) ๋ถ๋ฆฌ ํฉ์ฑ๊ณฑ ์ธต์ ์ค๊ฐ ํํ๋ก ์๊ฐํ ์ ์๋ค.
14.5.7 SENet
์๋ ๊ตฌ์กฐ์ ์๋ ๋ชจ๋ ์ธ์ ์ ๋ชจ๋์ด๋ ๋ชจ๋ ์์ฐจ ์ ๋์ SE ๋ธ๋ก์ด๋ผ๋ ์์ ์ ๊ฒฝ๋ง์ ์ถ๊ฐํ์ฌ ์ฑ๋ฅ์ ํฅ์ํ๋ค.

SE ๋ธ๋ก์ด ์ถ๊ฐ๋ ๋ถ๋ถ์ ์ ๋์ ์ถ๋ ฅ์ ๊น์ด ์ฐจ์์ ์ด์ ์ ๋ง์ถ์ด ๋ถ์ํ๋ค. (๊ณต๊ฐ ํจํด์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค.)
์ด๋ค ํน์ฑ์ด ์ผ๋ฐ์ ์ผ๋ก ๋์์ ๊ฐ์ฅ ํฌ๊ฒ ํ์ฑํ๋๋์ง ํ์ตํ ๋ค์, ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ฑ ๋งต์ ๋ณด์ ํ๋ค.

ํ๋์ SE ๋ธ๋ก์ 3๊ฐ์ ์ธต์ผ๋ก ๊ตฌ์ฑ๋๋ค.
์ ์ญ ํ๊ท ํ๋ง ์ธต๊ณผ ReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ง ์๋ ์ธต, ์๊ทธ๋ชจ์ด๋ ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ง ์ถ๋ ฅ ์ธต์ด๋ค.

์ฒ์์ ์ ์ญ ํ๊ท ํ๋ง ์ธต์ด ๊ฐ ํน์ฑ ๋งต์ ๋ํ ํ๊ท ํ์ฑํ ๊ฐ์ ๊ณ์ฐํ๋ค.
์) 256๊ฐ์ ํน์ฑ ๋งต์ ๊ฐ์ง ์ ๋ ฅ์ด๋ผ๋ฉด ๊ฐ ํํฐ์ ์ ๋ฐ์ ์ธ ์๋ต ์์ค์ ๋ํ๋ด๋ 256๊ฐ์ ์ซ์๊ฐ ์ถ๋ ฅ๋๋ค.
๋ค์ ์ธต์์ ์์ถ์ด ์ผ์ด๋๋ค. ์ด ์ธต์ 256๊ฐ๋ณด๋ค ํจ์ฌ ์ ์ ๋ด๋ฐ์ ๊ฐ์ง๋ค. ์ผ๋ฐ์ ์ผ๋ก ํน์ฑ ๋งต ๊ฐ์๋ณด๋ค 16๋ฐฐ ์ ๋ค.
์) 256๊ฐ์ ์ซ์๊ฐ ์์ ๋ฒกํฐ(16์ฐจ์)๋ก ์์ถ๋๋ค.
์ด ์ ์ฐจ์ ๋ฒกํฐ(ํ๋์ ์๋ฒ ๋ฉ)๋ ํน์ฑ ์๋ต์ ๋ถํฌ๋ฅผ ํํํ๋ค.
์ด ๋ณ๋ชฉ ์ธต์ ํตํด SE ๋ธ๋ก์ด ํน์ฑ ์กฐํฉ์ ๋ํ ์ผ๋ฐ์ ์ธ ํํ์ ํ์ตํ๋ค.
๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅ ์ธต์ ์ด ์๋ฒ ๋ฉ์ ๋ฐ์ ํน์ฑ ๋งต๋ง๋ค 0๊ณผ 1 ์ฌ์ด์ ํ๋์ ์ซ์๋ฅผ ๋ด์ ๋ชจ์ ๋ ๋ฒกํฐ(256๊ฐ)๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ค์ ํน์ฑ ๋งต๊ณผ ์ด ๋ณด์ ๋ ๋ฒกํฐ๋ฅผ ๊ณฑํด ๊ด๋ จ์๋ (๋ณด์ ๋ ์ ์๊ฐ ๋ฎ์)ํน์ฑ๊ฐ์ ๋ฎ์ถ๊ณ ๊ด๋ จ ์๋ (๋ณด์ ๋ ์ ์๊ฐ 1์ ๊ฐ๊น์ด) ํน์ฑ๊ฐ์ ๊ทธ๋๋ก ์ ์งํ๋ค.
14.6 ์ผ๋ผ์ค๋ก ResNet-34 CNN ๊ตฌํํ๊ธฐ
๋จผ์ ResidualUnit ์ธต์ ๋ง๋ ๋ค.
DefualtConv2D = partial(tf.keras.layers.Conv2D, kernel_size=3, strides=1, padding="same", kernel_initializer="he_normal", use_bias=False) class ResidualUnit(tf.keras.layers.Layer): def __init__(self, filters, strides=1, activation="relu", **kwargs): super().__init__(**kwargs) self.activation = tf.keras.activations.get(activation) self.main_layers = [ DefaultConv2D(filters, strides=strides), tf.keras.layers.BatchNormalization(), self.activation, DefaultConv2D(filter), tf.keras.layers.BatchNormalization() ] self.skip_layers = [] if strides > 1: self.skip_layers = [ DefaultConv2D(filters, kernel_size=1, strides=strides), tf.keras.layers.BatchNormalization() ] def call(self, inputs): Z = inputs for layer in self.main_layers: Z = layer(Z) skip_Z = inputs for layer in self.skip_layers: skip_Z = layer(skip_Z) return self.activation(Z + skip_Z)call() ๋ฉ์๋์์ ์ ๋ ฅ์ main_layers์ (skip_layers๊ฐ ์๋ค๋ฉด) skip_layers์ ํต๊ณผ์ํจ ํ ๋ ์ถ๋ ฅ์ ๋ํ์ฌ ํ์ฑํ ํจ์๋ฅผ ์ ์ฉํ๋ค.
์ด ๋คํธ์ํฌ๋ ์ฐ์๋์ด ๊ธธ๊ฒ ์ฐ๊ฒฐ๋ ์ธต์ด๊ธฐ ๋๋ฌธ์ Sequential ํด๋์ค๋ฅผ ์ฌ์ฉํด ResNet-34 ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ค.
ResidualUnit ํด๋์ค๋ฅผ ์ค๋นํด๋์์ผ๋ ์์ฐจ ์ ๋์ ํ๋์ ์ธต์ฒ๋ผ ์ทจ๊ธํ ์ ์๋ค.
model = tf.keras.Sequential([ DefaultConv2D(64, kernel_size=7, strides=2, input_shape=[224, 224, 3]), tf.keras.layers.BatchNormalization(), tf.keras.layers.Activation("relu"), tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding="same"), ]) prev_filters = 64 for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3: strides = 1 if filters == prev_filters else 2 model.add(ResidualUnit(filters, strides=strides)) prev_filters = filters model.add(tf.keras.layers.GlobalAvgPool2D()) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(10, activation="softmax"))
14.7 ์ผ๋ผ์ค์ ์ฌ์ ํ๋ จ ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ
model = tf.keras.applizations.resnet50.ResNet50(weights="imagenet")ResNet-50 ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ด๋ฏธ์ง๋ท ๋ฐ์ดํฐ์ ์์ ์ฌ์ ํ๋ จ๋ ๊ฐ์ค์น๋ฅผ ๋ค์ด๋ก๋ํ๋ค.
images = load_sample_images()["images"] images_resized = tf.keras.lyaers.Resizing(height=224, width=224, crop_to_aspect_radio=True)(images)์ผ๋ผ์ค์ Resizing ์ธต์ ์ด์ฉํด ์ํ ์ด๋ฏธ์ง ๋ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
inputs = tf.keras.applications.resnet50.preprocess_input(images_resized)์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ด๋ฏธ์ง๊ฐ ์ ์ ํ ๋ฐฉ์์ผ๋ก ์ ์ฒ๋ฆฌ๋์๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ 0์์ 1 ์ฌ์ด ๋๋ -1์์ 1 ์ฌ์ด์ ์ ๋ ฅ์ ๊ธฐ๋ํ๋ค.
์ด๋ฅผ ์ํด ๋ชจ๋ธ๋ง๋ค ์ด๋ฏธ์ง๋ฅผ ์ ์ฒ๋ฆฌํด์ฃผ๋ preprocess_input() ํจ์๋ฅผ ์ ๊ณตํ๋ค.
Y_proba = model.predict(inputs) Y_proba.shape # (2, 1000)์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํด ์์ธก์ ์ํํ ์ ์๋ค.
์ถ๋ ฅ Y_proba๋ ํ์ด ํ๋์ ์ด๋ฏธ์ง์ด๊ณ ์ด์ด ํ๋์ ํด๋์ค์ธ ํ๋ ฌ์ด๋ค.
top_K = tf.keras.applizations.resnet50.decode_predictions(Y_prova, top=3) for image_index in range(len(images)): print(f"Image #{image_index}") for class_id, name, y_proba in top_K[image_index]: print(f" {class_id} - {name:12s} {y_proba:.2%}")์ต์์ K๊ฐ์ ์์ธก์ ํด๋์ค ์ด๋ฆ๊ณผ ์์ธก ํด๋์ค์ ์ถ์ ํ๋ฅ ์ ์ถ๋ ฅํ๋ ค๋ฉด decode_predictions() ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ด ํจ์๋ ๊ฐ ์ด๋ฏธ์ง์ ๋ํด ์ต์์ K๊ฐ์ ์์ธก์ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
๊ฐ ์์ธก์ ํด๋์ค IP(class_id), ์ด๋ฆ(name), ํ๋ฅ (y_proba)์ ํฌํจํ ํํ์ด๋ค.
# Image #0 # n03877845 - palace 54.69% # n03781244 - monastery 24.72% # n02825657 - bell_cote 18.55% # Image #1 # n04522168 - vase 32.66% # n11939491 - daisy 17.81% # n03530642 - honeycomb 12.06%
14.8 ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์ด ํ์ต
import tensorflow_datasets as tfds dataset, info = ftds.load("tf_flowers", as_supervised=True, with_info=True) dataset_size = info.splits["train"].num_examples # 370 class_names = info.features["label"].names # ["dandelion", "daisy", ...] n_classes = info.features["label"].num_classes # 5ํ ์ํ๋ก ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ค.
with_info=True๋ก ์ง์ ํ๋ฉด ๋ฐ์ดํฐ์ ์ ๊ดํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
test_set_raw, valid_set_raw, train_set_raw = tfds.load( "tf_flowers", split=["train[:10%]", "train[10%:25%]", "train[25%:]"], as_supervised=True)๋ฐ์ดํฐ์ ์ ํ ์คํธ ์ธํธ, ๊ฒ์ฆ ์ธํธ, ํ๋ จ ์ธํธ๋ก ๋๋๋ค.
batch_size = 32 preprocess = tf.keras.Sequential([ tf.keras.layers.Resizing(height=224, width=224, crop_to_aspect_ratio=True), tf.keras.layers.Lambda(tf.keras.applications.xception.preprocess_input) ]) train_set = train_set_raw.map(lambda X, y: (preprocess(X), y)) trian_set = train_set.shuffle(1000, seed=42).batch(batch_size).prefetch(1) valid_set = valid_set_raw.map(lambda X, y: (preprocess(X), y)).batch(batch_size) test_set = test_set_raw.map(lambda X, y: (preprocess(X), y)).batch(batch_size)์ธ ๋ฐ์ดํฐ์ ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฑ๊ฐ๋ก ํฌํจํ๊ณ ์๋ค.
์ด๋ฅผ ๋ฐฐ์น๋ก ๋ฌถ์ด์ผ ํ์ง๋ง ๋จผ์ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋ชจ๋ ๋์ผํ์ง ํ์ธํด์ผ ํ๋ค. (๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌถ์ ์ ์๋ค.)
๋ํ Xception ๋ชจ๋ธ์ ๋ง๋๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด tf.keras.applications.xception.preprocess_input() ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
๋ง์ง๋ง์ผ๋ก ํ๋ จ ์ธํธ๋ฅผ ์๊ณ ํ๋ฆฌํ์นญํ๋ค.
data_augmentation = tf.keras.Sequential([ tf.keras.layers.RandomFlip(mode="horizontal", seed=42), tf.keras.layers.RandomRotation(factor=0.05, seed=42), tf.keras.layers.RandomContrast(factor=0.2, seed=42) ])์ด ๋ฐ์ดํฐ์ ์ ์์ฃผ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ๋ฐ์ดํฐ ์ฆ์์ด ๋์์ด ๋๋ค.
ํ๋ จํ๋ ๋์ ์ด๋ฏธ์ง๋ฅผ ์ํ์ผ๋ก ๋๋คํ๊ฒ ๋ค์ง๊ณ , ์ฝ๊ฐ ํ์ ํ๊ณ , ๋ช ์์ ์กฐ์ ํ๋ค.
๋ฐ์ดํฐ ์ฆ์์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ํ๋ จ ์ธํธ์ ๋ํ ์ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ฐ๊พธ์ด ํ๋ จ ์ด๋ฏธ์ง๋ฅผ ๋๋คํ๊ฒ ๋ณํํ๋ฉด ๋๋ค.
ft.image.random_crop() ํจ์๋ก ์ด๋ฏธ์ง๋ฅผ ๋๋คํ๊ฒ ์๋ฅด๊ฑฐ๋ tf.image.random_flip_left_right() ํจ์๋ก ์ด๋ฏธ์ง๋ฅผ ์ํ์ผ๋ก ๋๋คํ๊ฒ ๋ค์ง๋ ์์ด๋ค.
base_model = tf.keras.applications.xception.Xception(weights="imagenet", include_top=False) avg = tf.keras.layers.GlobalAveragePooling2D()(base_model.output) output = tf.keras.layers.Dense(n_classes, activation="softmax")(avg) model = tf.keras.Model(inputs=base_model.input, outputs=output)์ด๋ฏธ์ง๋ท์์ ์ฌ์ ํ๋ จ๋ Xception ๋ชจ๋ธ์ ๋ก๋ํ๋ค.
include_top=False๋ก ์ง์ ํ์ฌ ๋คํธ์ํฌ์ ์ต์ ์ธต์ ํด๋นํ๋ ์ ์ญ ํ๊ท ํ๋ง ์ธต๊ณผ ๋ฐ์ง ์ถ๋ ฅ ์ธต์ ์ ์ธ์ํจ๋ค.
์ด ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ถ๋ ฅ์ ๋ฐํ์ผ๋ก ์๋ก์ด ์ ์ญ ํ๊ท ํ๋ง ์ธต์ ์ถ๊ฐํ๊ณ ๊ทธ ๋ค์ ํด๋์ค๋ง๋ค ํ๋์ ์ ๋๊ณผ ์ํํธ๋งฅ์ค ํ์ฑํ ํจ์๋ฅผ ๊ฐ์ง ๋ฐ์ง ์ถ๋ ฅ ์ธต์ ๋๋๋ค.
๋ง์ง๋ง์ ์ผ๋ผ์ค์ Model๋ก ์ด๋ฅผ ๋ชจ๋ ๊ฐ์ผ๋ค.
for layer in base_model.layers: layer.trainable = Falseํ๋ จ ์ด๊ธฐ์๋ ์ฌ์ ํ๋ จ๋ ์ธต์ ๊ฐ์ค์น๋ฅผ ๋๊ฒฐํ๋ ๊ฒ ์ข๋ค.
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9) model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"]) history = model.fit(train_set, validation_data=valid_set, epochs=3)๋ชจ๋ธ์ ์ปดํ์ผํ๊ณ ํ๋ จ์ ์์ํ๋ค.
for layer in base_model.layers[56:]: layer.trainable = True๋ชจ๋ธ์ ๋ช ๋ฒ์ ์ํฌํฌ ๋์ ํ๋ จํ๋ฉด ๊ฒ์ฆ ์ ํ๋๊ฐ ๋ ๋์์ง์ง ์๋ ์๊ฐ์ด ์๊ธฐ๋๋ฐ ์ด๋ ์๋ก ์ถ๊ฐํ ์ต์์ ์ธต์ด ์ ํ๋ จ๋์์์ ์๋ฏธํ๋ค.
-> ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์์ ์ธต ์ผ๋ถ์ ๋๊ฒฐ์ ํด์ ํ๊ณ ํ๋ จ์ ๊ณ์ํ๋ค.
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9) model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"]) history = model.fit(train_set, validation_data=valid_set, epochs=10)์ธต์ ๋๊ฒฐํ๊ฑฐ๋ ํด์ ํ ๋ ๋ชจ๋ธ์ ๋ค์ ์ปดํ์ผํด์ผ ํ๋ค.
์ฌ์ ํ๋ จ๋ ๊ฐ์ค์น๊ฐ ํผ์๋๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ํจ์ฌ ์์ ํ์ต๋ฅ ์ ์ฌ์ฉํ๋ค.
14.9 ๋ถ๋ฅ์ ์์น ์ถ์
์ฌ์ง์์ ๋ฌผ์ฒด์ ์์น๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ํ๊ท ์์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
๋ฌผ์ฒด ์ฃผ์์ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์์ธกํ๋ ๊ฒ์ธ๋ฐ, ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฌผ์ฒด ์ค์ฌ์ ์ํ, ์์ง ์ขํ์ ๋์ด, ๋๋น๋ฅผ ์์ธกํ๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ์ญ ํ๊ท ํ๋ง ์ธต ์์ ๋ค ๊ฐ์ ์ ๋์ ๊ฐ์ง ๋ ๋ฒ์งธ ๋ฐ์ง ์ถ๋ ฅ ์ธต์ ์ถ๊ฐํ๊ณ MSE ์์ค์ ์ฌ์ฉํด ํ๋ จํ๋ค.
base_model = tf.keras.applications.xception.Xception(weights="imagenet", include_top=False) avg = tf.keras.layers.GlobalAveragePooling2D()(base_model.output) class_output = tf.keras.lauers.Dense(n_classes, activation="softmax")(avg) loc_output = tf.keras.layers.Dense(4)(avg) model = tf.keras.Model(inputs=base_model.input, outputs=[class_output, loc_output]) model.compile(loss=["sparse_categorical_crossentropy", "mse"], loss_wieghts=[0.8, 0.2], optimizer=optimizer, metrics=["accuracy"]๊ฝ ๋ฐ์ดํฐ์ ์ ๊ฝ ์ฃผ์์ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ง์ ๋ง๋ค์ด ์ถ๊ฐํด์ผ ๋๋ค.
๋ ์ด๋ธ์ ๋ง๋๋ ๊ฒ์ ๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์์ ๊ฐ์ฅ ์ด๋ ต๊ณ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด๋ค.
์๊ฐ์ ๋ค์ฌ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ข๋ค.
๊ฝ ๋ฐ์ดํฐ์ ์ ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ํด ๋ฐ์ด๋ฉ ๋ฐ์ค๊ฐ ์ค๋น๋์๋ค๊ณ ๊ฐ์ ํ๋ค.
ํด๋์ค ๋ ์ด๋ธ, ๋ฐ์ด๋ฉ ๋ฐ์ค์ ํจ๊ผ ์ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง์ ๋ฐฐ์น๊ฐ ํ๋์ ์์์ธ ๋ฐ์ดํฐ์ ์ ๋ง๋ค์ด์ผ ํ๋ค.
๊ฐ ์์๋ (images, (class_labels, bounding_boxes)) ํํ์ ํํ์ด ๋๋ค.
MSE๋ฅผ ๋ชจ๋ธ ํ๋ จ์ ์ํ ์์ค ํจ์๋ก ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ๋ชจ๋ธ์ด ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์ผ๋ง๋ ์ ์์ธกํ๋์ง ํ๊ฐํ๋ ๋ฐ ์ข์ ์งํ๋ ์๋๋ค.
-> ๋ฐ์ด๋ฉ ๋ฐ์ค์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์งํ๋ IoU์ด๋ค.
์์ธกํ ๋ฐ์ด๋ฉ ๋ฐ์ค์ ํ๊น ๋ฐ์ด๋ฉ ๋ฐ์ค ์ฌ์ด์ ์ค์ฒฉ๋๋ ์์ญ์ ์ ์ฒด ์์ญ์ผ๋ก ๋๋ ๊ฒ์ด๋ค. (tf.keras.metrics.MeanIoU)
14.10 ๊ฐ์ฒด ํ์ง
ํ๋์ ์ด๋ฏธ์ง์์ ์ฌ๋ฌ ๋ฌผ์ฒด๋ฅผ ๋ถ๋ฅํ๊ณ ์์น๋ฅผ ์ถ์ ํ๋ ์์ ์ ์๋ฏธํ๋ค.
๋ช ๋ ์ ๊น์ง ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ์ง ์ค์์ ๋์ธ ํ๋์ ๋ฌผ์ฒด๋ฅผ ๋ถ๋ฅํ๊ณ ์์น๋ฅผ ์ฐพ๋ CNN์ ํ๋ จํ ๋ค์ ์ด CNN์ผ๋ก ์ด๋ฏธ์ง ์๋ฅผ ํ์ผ๋ฉด์ ๊ฐ ์์น์์ ์์ธก์ ๋ง๋๋ ๊ฒ์ด๋ค.
์ด CNN์ ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ํ๋ฅ ๊ณผ ๋ฐ์ด๋ฉ ๋ฐ์ค ์ธ์๋ ๊ฐ์ฒด์ฑ ์ ์๋ฅผ ์์ธกํ๋๋ก ํ๋ จ๋๋ค.
์ด๋ ์ด๋ฏธ์ง์ ์ค์๋ถ์ ์ค์ ๊ฐ์ฒด๊ฐ ์๋์ง์ ๋ํ ์ถ์ ํ๋ฅ ์ด๋ค.
์ด ๊ฐ์ ์ด์ง ๋ถ๋ฅ ์ถ๋ ฅ์ด๋ฏ๋ก ํ๋์ ์ ๋๊ณผ ์๊ทธ๋ชจ์ด๋ ํ์ฑํ ํจ์๋ฅผ ๊ฐ์ง ๋ฐ์ง ์ถ๋ ฅ ์ธต์ ์ฌ์ฉํ๊ณ ์ด์ง ํฌ๋ก์ค ์ํธ๋กํผ ์์ค๋ก ํ๋ จํ์ฌ ๋ง๋ค ์ ์๋ค.

์ ์ฒด ์ด๋ฏธ์ง์ ๊ฑธ์ณ ์ด CNN์ ์ฌ๋ผ์ด๋ฉํ๋ฉด 3x5 ๊ทธ๋ฆฌ๋๋ก ๊ตฌ์ฑ๋ ์ด 15๊ฐ์ ๋ฐ์ด๋ฉ ๋ฐฉ์ค ์์ธก์ด ๋ง๋ค์ด์ง๊ณ ๊ฐ ๋ฐ์ด๋ฉ ๋ฐ์ค์๋ ์ถ์ ํด๋์ค ํ๋ฅ ๊ณผ ๊ฐ์ฒด์ฑ ์ ์๊ฐ ํจ๊ป ํ์๋๋ค.
์ด ๋ฐฉ์์ ๋งค์ฐ ์ฝ์ง๋ง ์กฐ๊ธ์ฉ ๋ค๋ฅธ ์์น์์ ๋์ผํ ๋ฌผ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฐ์งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๋ถํ์ํ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ์ฌํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค. (NMS)
[NMS ๋ฐฉ๋ฒ]

์ด ๋ฐฉ๋ฒ์ CNN์ ์ฌ๋ฌ ๋ฒ ์คํ์์ผ์ผ ํ๋ฏ๋ก ๋ง์ด ๋๋ฆฌ๋ค.
์์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(FCN)์ ์ฌ์ฉํ๋ฉด CNN์ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์ด๋ฏธ์ง์ ์ฌ๋ผ์ด๋ฉ์ํฌ ์ ์๋ค.
14.10.1 ์์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง
CNN ๋งจ ์์ ๋ฐ์ง ์ธต์ ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
๋ฐ์ง ์ธต์ ์ ๋ ฅ ํน์ฑ๋ง๋ค ํ๋์ ๊ฐ์ค์น๋ฅผ ๋๋ฏ๋ก ํน์ ์ ๋ ฅ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ํ์ง๋ง ํฉ์ฑ๊ณฑ ์ธต์ ์ด๋ค ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ ์ฒ๋ฆฌํ ์ ์๋ค.
๋์ ํฉ์ฑ๊ณฑ ์ธต์ ์ ๋ ฅ ์ฑ๋๋ง๋ค ์ปค๋ ๊ฐ์ค์น๊ฐ ๋ฌ๋ผ์ ํน์ ๊ฐ์์ ์ฑ๋์ ๊ธฐ๋ํ๋ค.
FCN์ ํฉ์ฑ๊ณฑ ์ธต๋ง ๊ฐ์ง๋ฏ๋ก ์ด๋ค ํฌ๊ธฐ์ ์ด๋ฏธ์ง์์๋ ํ๋ จํ๊ณ ์คํํ ์ ์๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ฑ ํ ๋ฒ๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ค.

14.10.2 YOLO
๊ฐ ๊ฒฉ์ ์ ์์ ๋ฐ์ด๋ฉ ๋ฐ์ค ์ค์ฌ์ด ์ ์์ ์๋ ๊ฐ์ฒด๋ง ๊ณ ๋ คํ๋ค. ๋ฐ์ด๋ฉ ๋ฐ์ค ์ขํ๋ ์ ์ ์๋์ ์ด๋ค. (0, 0)์ ์ ์ ์ผ์ชฝ ์๋จ์ ์๋ฏธํ๊ณ (1, 1)์ ์ค๋ฅธ์ชฝ ํ๋จ์ ์๋ฏธํ๋ค. ํ์ง๋ง ๋ฐ์ด๋ฉ ๋ฐ์ค์ ๋์ด์ ๋๋น๋ ์ ๊ฒฝ๊ณ๋ฅผ ๋์ ์ ์๋ค.
๊ฒฉ์ ์ ๋ง๋ค ๋ ๊ฐ์ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ฅผ ํตํด ๋ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๊ฐ๊น์ด ์์ด์ ๋ฐ์ด๋ฉ ๋ฐ์ค ์ค์ฌ์ด ๊ฐ์ ์ ์์ ๋์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ์ด๋ฉ ๋ฐ์ค๋ง๋ค ๊ฐ์ฒด์ฑ ์ ์๊ฐ ์ ๊ณต๋๋ค.
๊ฒฉ์ ์ ์ ๋ํ ํด๋์ค ํ๋ฅ ๋ถํฌ๋ฅผ ์ถ๋ ฅํ๋ค.
14.11 ๊ฐ์ฒด ์ถ์
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ์ถ์ ์์คํ ์ DeepSORT์ด๋ค.

14.12 ์๋งจํฑ ๋ถํ
ํฝ์ ์์ค์ผ๋ก ๊ฐ์ฒด์ ์์น๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ ํฝ์ ์ ํฝ์ ์ด ์ํ ๊ฐ์ฒด์ ํด๋์ค๋ก ๋ถ๋ฅ๋๋ค.
์ด ์์ ์์ ๊ฐ์ฅ ์ด๋ ค์ด ์ ์ ์ด๋ฏธ์ง๊ฐ ์ผ๋ฐ์ ์ธ CNN์ ํต๊ณผํ ๋ ์ ์ง์ ์ผ๋ก ์์น ์ ๋ณด๋ฅผ ์๋ ๊ฒ์ ์๋ค. (1 ์ด์์ ์คํธ๋ผ์ด๋๋ฅผ ์ฌ์ฉํ๋ ์ธต ๋๋ฌธ์ด๋ค.)

ํด์๋๋ฅผ ๋๋ฆฌ๋ ์ ์ํ๋ง ์ธต์ ์ถ๊ฐํ๋ค.
์ด์ค ์ ํ ๋ณด๊ฐ์ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ 4๋ฐฐ๋ 8๋ฐฐ๋ก ๋๋ฆฌ๋ ๋ฐ ์ ํฉํ๋ค.
์ ์น ํฉ์ฑ๊ณฑ ์ธต์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
์ด๋ฏธ์ง์ 0์ผ๋ก ์ฑ์์ง ๋น ํ๊ณผ ์ด์ ์ฝ์ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋๋ฆฐ ๋ค์ ์ผ๋ฐ์ ์ธ ํฉ์ฑ๊ณฑ์ ์ํํ๋ค.
์ด๋ฅผ ๋ถ๋ถ ์คํธ๋ผ์ด๋๋ก ์ฌ์ฉํ๋ ์ผ๋ฐ ํฉ์ฑ๊ณฑ์ผ๋ก ์๊ฐํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ ์น ํฉ์ฑ๊ณฑ ์ธต์ ์ ํ ๋ณด๊ฐ์ ๊ฐ๊น์ด ์์ ์ ์ํํ๋๋ก ์ด๊ธฐํ๋ ์ ์์ง๋ง ํ๋ จ๋๋ ์ธต์ด๊ธฐ ๋๋ฌธ์ ํ๋ จ ๊ณผ์ ์์ ์ฑ๋ฅ์ด ๋ ๋๋น ์ง ์ ์๋ค. (Conv2DTranspose ์ธต)

์ ํ๋ ๊ฐ์ ์ ์ํด ์๋์ชฝ ์ธต์์๋ถํฐ ์คํต ์ฐ๊ฒฐ์ ์ถ๊ฐํ๋ค.

์๋ณธ ์ด๋ฏธ์ง๋ณด๋ค ๋ ํฌ๊ฒ ์ ์ํ๋งํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ ์ดํด์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
'๐ฎ ์ด๊ฒ์ ๊ฒ ๊ณต๋ถ > โฉ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ