ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • โœฑ ํ•ธ์ฆˆ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ 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 ์ธต)

     

    ์ •ํ™•๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด ์•„๋ž˜์ชฝ ์ธต์—์„œ๋ถ€ํ„ฐ ์Šคํ‚ต ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    ์›๋ณธ ์ด๋ฏธ์ง€๋ณด๋‹ค ๋” ํฌ๊ฒŒ ์—…์ƒ˜ํ”Œ๋งํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ดˆํ•ด์ƒ๋„๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

     

Designed by Tistory.