๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ˜ŽAI/DeepLearning_WIL

[DL/WIL] 2 ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(Convolution Neural Network, CNN)

by SolaKim 2024. 11. 19.

ํ•„ํ„ฐ์™€ ์ปค๋„

Convolution Neural Network ์—์„œ๋Š” Fully Connected Neural Network ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋‰ด๋Ÿฐ์„ Filter ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๋‰ด๋Ÿฐ = ํ•„ํ„ฐ = ์ปค๋„ ๋ชจ๋‘ ๊ฐ™์€ ๋ง์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

Keras ์—์„œ Filter ๋Š” ๋‰ด๋Ÿฐ ๊ฐœ์ˆ˜๋ฅผ, Kernel ์€ ์ž…๋ ฅ์— ๊ณฑํ•ด์ง€๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์—์„œ ์‹ค์ œ ๊ณ„์‚ฐ์€ ๋ฐ€์ง‘์ธต๊ณผ ๋™์ผํ•˜๊ฒŒ ๋‹จ์ˆœํžˆ ์ž…๋ ฅ๊ณผ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ 2์ฐจ์› ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค. 

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

 

์ผ€๋ผ์Šค๋กœ ๊ตฌํ˜„ํ•œ ํ•ฉ์„ฑ๊ณฑ ์ธต

from tensorflow import keras

keras.layers.Conv2D(10, kernel_size=(3, 3), activation='relu')

์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•„ํ„ฐ ๊ฐœ์ˆ˜, ๋‘๋ฒˆ์งธ๋Š” ์ปค๋„์˜ ํฌ๊ธฐ. ์ด๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•ด์•ผ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค.
๋ณดํ†ต ์ปค๋„ ํฌ๊ธฐ๋Š” (3, 3)์ด๋‚˜ (5, 5)๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค.

 

ํŒจ๋”ฉ(Padding)๊ณผ ์ŠคํŠธ๋ผ์ด๋“œ(Stride)

• Padding ์ด๋ž€ (์ถœ๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ์ž…๋ ฅ์˜ ํฌ๊ธฐ์™€ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ) ๋งˆ์น˜ ๋” ํฐ ์ž…๋ ฅ์— ํ•ฉ์„ฑ๊ณฑ์„ ํ•˜๋Š” ์ฒ™์„ ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ์ฃผ์œ„๋ฅผ ๊ฐ€์ƒ์˜ ์›์†Œ๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด๋‹ค.
• ์‹ค์ œ ์ž…๋ ฅ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒจ๋”ฉ์€ 0์œผ๋กœ ์ฑ„์šด๋‹ค. 
• ์ฆ‰ (4, 4) ํฌ๊ธฐ์˜ ์ž…๋ ฅ์— 0์„ 1๊ฐœ ํŒจ๋”ฉํ•˜๋ฉด (6, 6) ํฌ๊ธฐ์˜ ์ž…๋ ฅ์ด ๋œ๋‹ค.
• ํŒจ๋”ฉ์˜ ์—ญํ• ์€ ์ˆœ์ „ํžˆ ์ปค๋„์ด ๋„์žฅ(ํ•„ํ„ฐ)๋ฅผ ์ฐ์„ ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ ค์ฃผ๋Š” ๊ฒƒ ๋ฐ–์—๋Š” ์—†๋‹ค. ์‹ค์ œ ๊ฐ’์€ 0์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š๋Š”๋‹ค
• ์ž…๋ ฅ๊ณผ ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ž…๋ ฅ ์ฃผ์œ„์— 0์œผ๋กœ ํŒจ๋”ฉ ํ•˜๋Š” ๊ฒƒ์„ Same Padding ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์—์„œ๋Š” ์„ธ์ž„ ํŒจ๋”ฉ์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ์ž…๋ ฅ๊ณผ ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
• ํŒจ๋”ฉ ์—†์ด ์ˆœ์ˆ˜ํ•œ ์ž…๋ ฅ ๋ฐฐ์—ด์—์„œ๋งŒ ํ•ฉ์„ฑ๊ณฑ์„ ํ•˜์—ฌ ํŠน์„ฑ ๋งต์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ Valid Padding ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐธ๋ฆฌ๋“œ ํŒจ๋”ฉ์€ ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. 

ํ•ฉ์„ฑ๊ณฑ์—์„œ๋Š” ํŒจ๋”ฉ์„ ์™œ ์ฆ๊ฒจ ์‚ฌ์šฉํ• ๊นŒ?
๋งŒ์•ฝ ํŒจ๋”ฉ์ด ์—†๋‹ค๋ฉด ๋ชจ์„œ๋ฆฌ์— ์žˆ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ํŠน์„ฑ ๋งต์œผ๋กœ ์ž˜ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์ ์ ˆํ•œ ํŒจ๋”ฉ์€ ์ด์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€ ์ฃผ๋ณ€์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š๋„๋ก ๋„์™€์ค€๋‹ค. 

• Stride ๋ž€ ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ์˜ ์ด๋™ ํฌ๊ธฐ์ด๋‹ค.
• ํŠœํ”Œ๋กœ ์ด๋™ ์นธ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ ๊ฐ’์ธ 1 ์ด์™ธ์—๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

ํ’€๋ง(Pooling)

• ํ’€๋ง์€ ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ ๋งŒ๋“  ํŠน์„ฑ ๋งต์˜ ๊ฐ€๋กœ์„ธ๋กœ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
• ์˜ˆ๋ฅผ ๋“ค์–ด (2, 2, 3)ํฌ๊ธฐ์˜ ํŠน์„ฑ ๋งต์— ํ’€๋ง์„ ์ ์šฉํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ์ฐจ์›์ธ ๊ฐœ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ๋„ˆ๋น„์™€ ๋†’์ด๋งŒ ์ค„์–ด๋“ค์–ด (1, 1, 3)์ด ๋œ๋‹ค. 

์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” (2, 2) ํฌ๊ธฐ๋กœ ํ’€๋ง์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ’€๋ง์—๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋‹ค. ๋„์žฅ์„ ์ฐ์€ ์˜์—ญ์—์„œ ๊ฐ€์žฅ ํฐ๊ฐ’์„ ๊ณ ๋ฅด๊ฑฐ๋‚˜(Max pooling), ํ‰๊ท ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค(Average pooling). 

• ํ’€๋ง์—์„œ๋Š” ๊ฒน์น˜์ง€ ์•Š๊ณ  ์ด๋™ํ•œ๋‹ค. ํ’€๋ง์˜ ํฌ๊ธฐ๊ฐ€ (2,  2) ์ด๋ฉด ๊ฐ€๋กœ์„ธ๋กœ ๋‘ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค(stride ๊ฐ€ 2). (3, 3) ํ’€๋ง์ด๋ฉด ๊ฐ€๋กœ์„ธ๋กœ ์„ธ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.(stride ๊ฐ€ 3)

keras.layers.MaxPooling2D(2)

• MaxPooling2D์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ’€๋ง์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„ ํ’€๋ง์˜ ํฌ๊ธฐ๋Š” 2์ด๋‹ค. ์ฆ‰, ๊ฐ€๋กœ์„ธ๋กœ ํฌ๊ธฐ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ธ๋‹ค

• ๋งŽ์€ ๊ฒฝ์šฐ ํ‰๊ท  ํ’€๋ง๋ณด๋‹ค ์ตœ๋Œ€ ํ’€๋ง์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ํ‰๊ท  ํ’€๋ง์€ ํŠน์„ฑ ๋งต์— ์žˆ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ (ํ‰๊ท ํ•˜์—ฌ) ํฌ์„์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์˜ ์ „์ฒด ๊ตฌ์กฐ

• ํ•ฉ์„ฑ๊ณฑ ์ธต์€ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋กœ ๋ ๋ฃจ ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
• ๋ฐ€์ง‘์ธต์—์„œ Flatten ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 3์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ํŽผ์นœ๋‹ค. ์ด ๋ฐฐ์—ด์€ 12๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ 1์ฐจ์› ๋ฐฐ์—ด์ด๊ณ  ์ถœ๋ ฅ์ธต์˜ ์ž…๋ ฅ์ด ๋œ๋‹ค.
์ถœ๋ ฅ์ธต์—๋Š” 3๊ฐœ์˜ ๋‰ด๋Ÿฐ์„ ๋‘์—ˆ๋‹ค. ์ฆ‰, 3๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋‹ค์ค‘ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์ด๋‹ค. 

• ์ปฌ๋Ÿฌ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ(๋„ˆ๋น„, ๋†’์ด, ๊นŠ์ด)๋กœ 3์ฐจ์›์˜ ์ž…๋ ฅ์ธต์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„ํ„ฐ์˜ ์ปค๋„ ํฌ๊ธฐ๋„ 3์ฐจ์›์ด ๋œ๋‹ค. => ์ปค๋„ ๋ฐฐ์—ด์˜ ๊นŠ์ด๋Š” ํ•ญ์ƒ ์ž…๋ ฅ์˜ ๊นŠ์ด์™€ ๊ฐ™์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ

• ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ž…๋ ฅ์ด๋‚˜ ํ•„ํ„ฐ์˜ ์ฐจ์›์ด ๋ช‡ ๊ฐœ์ธ์ง€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์ถœ๋ ฅ์€ ํ•˜๋‚˜์˜ ๊ฐ’์ด๋‹ค. ์ฆ‰, ํŠน์„ฑ ๋งต์— ์žˆ๋Š” ํ•œ ์›์†Œ๊ฐ€ ์ฑ„์›Œ์ง„๋‹ค

 

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ ๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ ์ธต์˜ ํ•„ํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์ฒซ๋ฒˆ์งธ ํ’€๋ง ์ธต์„ ํ†ต๊ณผํ•œ ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๊ฐ€ (4, 4, 5)๋ผ๊ณ  ํ•ด๋ณด์ž.
๋‘๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ ํ•„ํ„ฐ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๊ฐ€ ๊ฐ๊ฐ 3์ด๋ผ๋ฉด ์ด ํ•„ํ„ฐ์˜ ์ปค๋„ ํฌ๊ธฐ๋Š” (3, 3, 5)๊ฐ€ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ž…๋ ฅ์˜ ๊นŠ์ด์™€ ํ•„ํ„ฐ์˜ ๊นŠ์ด๋Š” ๊ฐ™์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ (3 x 3 x 5 = 45 ๊ฐœ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•˜๊ณ  ์ ˆํŽธ์„ ๋”ํ•œ) ์ด ํ•ฉ์„ฑ๊ณฑ์˜ ๊ฒฐ๊ณผ๋Š” 1๊ฐœ์˜ ์ถœ๋ ฅ์„ ๋งŒ๋“ ๋‹ค. 

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

๐Ÿ’ก ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์—์„œ ํ•„ํ„ฐ๋Š” ์ด๋ฏธ์ง€์— ์žˆ๋Š” ์–ด๋–ค ํŠน์ง•์„ ์ฐพ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ฐ„๋‹จํ•œ ๊ธฐ๋ณธ์ ์ธ ํŠน์ง•(์ง์„ , ๊ณก์„  ๋“ฑ)์„ ์ฐพ๊ณ  ์ธต์ด ๊นŠ์–ด์งˆ์ˆ˜๋ก ๋‹ค์–‘ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ํŠน์ง•์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„ํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฐ๋‹ค. ๋˜ ์–ด๋–ค ํŠน์ง•์ด ์ด๋ฏธ์ง€์˜ ์–ด๋Š ์œ„์น˜์— ๋†“์ด๋”๋ผ๋„ ์‰ฝ๊ฒŒ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„ˆ๋น„์™€ ๋†’์ด ์ฐจ์›์„ ์ ์  ์ค„์—ฌ๊ฐ„๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ฉ์„ฑ๊ณฑ ์ธต๊ณผ ํ’€๋ง ์ธต์€ ๊ฑฐ์˜ ํ•ญ์ƒ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๊ฐ ํ•„ํ„ฐ๊ฐ€ ์ถ”์ถœํ•œ ํŠน์„ฑ ๋งต์„ ์ถœ๋ ฅํ•˜๋ฉด ํ’€๋ง ์ธต์—์„œ ํŠน์„ฑ ๋งต์˜ ๊ฐ€๋กœ์„ธ๋กœ๋ฅผ ์ค„์ธ๋‹ค.

 

Keras ์ด์šฉํ•ด์„œ ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง ๋งŒ๋“ค๊ธฐ

model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation = 'relu', padding = 'same', input_shape=(28,28,1)))

๋ชจ๋ธ์˜ add() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ธต์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 
์ด ํ•ฉ์„ฑ๊ณฑ ์ธต์€ 32๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ปค๋„์˜ ํฌ๊ธฐ๋Š” (3,3)์ด๊ณ  ๋ ๋ฃจ ํ™œ์„ฑํ™” ํ•จ์ˆ˜์™€ ์„ธ์ž„ ํŒจ๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.
์™„์ „ ์—ฐ๊ฒฐ ์‹ ๊ฒฝ๋ง์—์„œ์ฒ˜๋Ÿผ ์ผ€๋ผ์Šค ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ์˜ ์ฒซ ๋ฒˆ์งธ ์ธต์—์„œ ์ž…๋ ฅ์˜ ์ฐจ์›์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

๊ทธ ๋‹ค์Œ ํ’€๋ง ์ธต์„ ์ถ”๊ฐ€ํ•œ๋‹ค. 

model.add(keras.layers.MaxPooling2D(2))

(2,2) ํ’€๋ง์„ ์ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋น„์™€ ๋†’์ด๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ 32๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŠน์„ฑ ๋งต์˜ ๊นŠ์ด๋Š” 32๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Maxpooling ์„ ํ†ต๊ณผํ•œ ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๋Š” (14, 14, 32)๊ฐ€ ๋œ๋‹ค.

๋‘ ๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ-ํ’€๋ง ์ธต

model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))

์„ธ์ž„ ํŒจ๋”ฉ์„ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ์˜ ๊ฐ€๋กœ ์„ธ๋กœ ํฌ๊ธฐ๋Š” ์ค„์ด์ง€ ์•Š์•˜์ง€๋งŒ ํ’€๋ง ์ธต์—์„œ ํฌ๊ธฐ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ธ๋‹ค. ์ฆ‰, ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๋Š” (7, 7, 64)๊ฐ€ ๋œ๋‹ค.

์ด์ œ ์ด 3์ฐจ์› ํŠน์„ฑ ๋งต์„ ์ผ๋ ฌ๋กœ ํŽผ์น  ์ฐจ๋ก€์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋งˆ์ง€๋ง‰์— 10๊ฐœ์˜ ๋‰ด๋Ÿฐ์„ ๊ฐ€์ง„ (๋ฐ€์ง‘) ์ถœ๋ ฅ์ธต์—์„œ ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ํŠน์„ฑ ๋งต์„ ์ผ๋ ฌ๋กœ ํŽผ์ณ์„œ ๋ฐ”๋กœ ์ถœ๋ ฅ์ธต์— ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— ํ•˜๋‚˜์˜ ๋ฐ€์ง‘ ์€๋‹‰์ธต์„ ํ•˜๋‚˜ ๋” ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Flatten ํด๋ž˜์Šค ๋‹ค์Œ์— Dense ์€๋‹‰์ธต, ๋งˆ์ง€๋ง‰์œผ๋กœ Dense ์ถœ๋ ฅ์ธต์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ตฌ์„ฑํ•œ๋‹ค. 

model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu')
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10, activation='softmax'))

๋“œ๋กญ์•„์›ƒ ์ธต์ด ์€๋‹‰์ธต์˜ ๊ณผ๋Œ€์ ํ•ฉ์„ ๋ง‰์•„ ์„ฑ๋Šฅ์„ ์กฐ๊ธˆ ๋” ๊ฐœ์„ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ํด๋ž˜์Šค 10๊ฐœ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋‹ค์ค‘ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์ธต์˜ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋Š” ์†Œํ”„ํŠธ๋งฅ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ž, ์ด์ œ ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด์ž.

์ฒซ ๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ ์ธต์€ 32๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํฌ๊ธฐ๊ฐ€ (3, 3), ๊นŠ์ด๊ฐ€ 1์ด๋‹ค. ๋˜ ํ•„ํ„ฐ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ ˆํŽธ์ด ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด 3 x 3 x 1 x 32 + 32 = 320๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ํ•ฉ์„ฑ๊ณฑ ์ธต์€ 64๊ฐœ์˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํฌ๊ธฐ๊ฐ€ (3, 3), ๊นŠ์ด๊ฐ€ 32์ด๋‹ค. ๋˜ ํ•„ํ„ฐ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ ˆํŽธ์ด ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด 3 x 3 x 32 x 64 + 64 = 18,496๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค. 

Flatten ํด๋ž˜์Šค์—์„œ (7, 7 ,64) ํฌ๊ธฐ์˜ ํŠน์„ฑ ๋งต์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํŽผ์น˜๋ฉด (3136, ) ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์ด ๋œ๋‹ค. ์ด๋ฅผ 100๊ฐœ์˜ ๋‰ด๋Ÿฐ๊ณผ ์™„์ „ํžˆ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์€๋‹‰์ธต์˜ ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋Š” 3,136 x 100 + 100 = 313,700๊ฐœ ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ์ถœ๋ ฅ์ธต์˜ ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋Š” 1,010๊ฐœ ์ด๋‹ค. 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธต์˜ ๊ตฌ์„ฑ์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

keras.utils.plot_model(model, show_shapes=True)

 

๋ชจ๋ธ ์ปดํŒŒ์ผ๊ณผ ํ›ˆ๋ จ

model.compile(optimize='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5', save_best_only=True)

early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)

history = model.fit(train_scaled, train_target, epochs=20, validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb, early_stopping_cb])

 

ModelCheckpoint๋Š” ํ•™์Šต ์ค‘ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ๊ฐ€์ค‘์น˜(weights) ๋˜๋Š” ์ „์ฒด ๋ชจ๋ธ์„ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

EarlyStopping ์€ ๋ชจ๋ธ์ด ๋” ์ด์ƒ ๊ฐœ์„ ๋œ์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, ํ•™์Šต์„ ์กฐ๊ธฐ ์ข…๋ฃŒํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.