๐Ÿšฉ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ์ดˆ - part20. CNN ์ดํ•ดํ•˜๊ธฐ

vincaยท2022๋…„ 12์›” 14์ผ
1

๐ŸŒ“ AI/DL - theory

๋ชฉ๋ก ๋ณด๊ธฐ
20/24

Introduction

์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” CNN์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

CNN์˜ ๊ตฌ์„ฑ

๊ฐ€์žฅ ๋ณดํŽธํ™”๋œ CNN์˜ ๊ตฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ๋ ˆ์ด์–ด์˜ ์—ญํ• 

  • Convolution Layer๋Š” ํŠน์ง•์„ ์ถ”์ถœํ•˜๋Š” ์—ญํ• 
  • Pooling Layer๋Š” ๋ถ„๋ฅ˜๋ฅผ ์ž˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• .(๊ณผ์ ํ•ฉ ๋ฐฉ์ง€ ๋ฐ ์ „์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ค„์—ฌ ์—ฐ์‚ฐ๋Ÿ‰์„ ๊ฐ์†Œ)
  • FC Layer๋Š” ์ถ”์ถœ๋œ ํŠน์ง•์„ ํ†ตํ•ด ํ•™์Šตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

CNN์—์„œ ํ•™์Šต๋˜๋Š” ๊ฒƒ์€?

Convolution Layer์—์„œ ํŠน์ง•์„ ์ž˜ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” kernel์˜ ๊ฐ€์ค‘์น˜(weight)๊ฐ€ ํ•™์Šต๋œ๋‹ค.
์ปค๋„์ด๋ž€ ์ปจ๋ณผ๋ฃจ์…˜ ๋ ˆ์ด์–ด๊ฐ€ ํ•™์Šต๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•˜๋‚˜์˜ ํŒ๊ณผ ๊ฐ™๋‹ค.
๋ฏธ๋ฆฌ ๋ณด์ž๋ฉด ์ด๋ฏธ์ง€์— ๋ปฅ ๋šซ๋ฆฐ ์ € ์‚ฌ๊ฐํ˜•์ด ์ปค๋„์ด๋‹ค.


DMLP์™€ CNN์˜ ๋น„๊ต

DMLP(Fully Connected)

  • ์™„์ „ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋กœ ๋†’์€ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
  • ํ•™์Šต์ด ๋งค์šฐ ๋Š๋ฆฌ๊ณ , ๊ณผ์ ํ•ฉ์˜ ์šฐ๋ ค๊ฐ€ ์žˆ์Œ

CNN

  • ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์„ ์ด์šฉํ•œ ๋ถ€๋ถ„ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋กœ ๋ชจ๋ธ์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถค
  • ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์˜ ์ข‹์€ ํŠน์ง• ์ถ”์ถœ(Weigth Sharing, ์ง€์—ญ์ ์ธ ํŠน์ง• ํ•™์Šต)
  • ๊ฒฉ์ž ๊ตฌ์กฐ(์˜์ƒ, ์Œ์„ฑ)๋“ฑ์— ์ ํ•ฉ
  • ์ธ๊ฐ„ ์‹œ๊ฐ๊ณผ ์œ ์‚ฌํ•œ ์ˆ˜์šฉ์žฅ์„ ๊ฐ€์ง

์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ ๊ณผ์ •

์ปค๋„์ด ์ด๋ฏธ์ง€๋ฅผ ์ด๋™ํ•˜๋ฉฐ ์ปค๋„๊ณผ feature๋งต ๊ฐ„์˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๋ฐ”์ด์–ด์Šค๋ฅผ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด?


feature map์˜ ๊ฐœ์ˆ˜

feature map์ด๋ž€?

์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์„ ํ†ต๊ณผํ–ˆ์„ ๋•Œ, ๋‚˜์˜ค๊ฒŒ๋˜๋Š” ์ถ”์ถœ๋œ ํŠน์ง• map์ด๋‹ค.
์ด๋Ÿฌํ•œ feature map์˜ ๊ฐœ์ˆ˜๋Š” ์ปจ๋ณผ๋ฃจ์…˜ layer์—์„œ์˜ ์ปค๋„์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ์ปค๋„ ํ•˜๋‚˜๋‹น ์ƒˆ๋กœ์šด feature map์ด ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ.
์ด๋Ÿฌํ•œ feature map์˜ ๋งŽ์€ ์ƒ์„ฑ์œผ๋กœ ์ธํ•ด ๊ณผ์ ํ•ฉ ๋ฐ ๋งŽ์€ ์—ฐ์‚ฐ๋Ÿ‰์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Conv2D ์ดํ›„ ์ง„ํ–‰ํ•˜๋Š” Maxpooling2D๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด๋‹ค.

์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์˜ ์˜ˆ์‹œ์™€ ๊ฒฐ๊ณผ

RGB 3๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. (7x7x3)
์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋Š” 3depth๋ฅผ ๊ฐ€์ง„๋‹ค. (๊นŠ์ด๊ฐ€ ์ด RGB๋กœ 3์ด๋ผ๋Š” ๋œป)
์ด๋•Œ ๊ฐ๊ฐ์˜ ์ฑ„๋„์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ ์ปค๋„์„ ์ ์šฉํ•ด๋„ ๋˜๊ณ , ๊ฐ™์€ ์ปค๋„์„ ์ ์šฉํ•ด๋„ ๋  ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” ํ•˜๋‚˜์˜ ์ปค๋„์„ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ํ–‰์˜ ๊ต์ฒด๋งŒ์„ ํ†ตํ•ด ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹จ ํ•œ๊ฐœ์˜ ์ปค๋„๋งŒ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ปค๋„์˜ ์‚ฌ์šฉ๊ฐœ์ˆ˜ = ์ดํ›„ ์ƒ์„ฑ๋˜๋Š” feature map์˜ ๊ฐœ์ˆ˜ ์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ฒฐ๊ณผ๋Š” (5x5x1)์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

dept๋Š” 1์ธ๊ฒƒ์„ ์•Œ๊ฒ ๋Š”๋ฐ, ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋Š” ์™œ ์ค„์—ˆ์„๊นŒ? ์•„๋ž˜์„œ ๋‚˜์˜ค๋Š” padding๊ณผ stride์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด๋‹ค.

์ปจ๋ณผ๋ฃจ์…˜ Layerํ†ต๊ณผ ์ดํ›„ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“  ์ด์œ ?

๋‹จ์ˆœํ•˜๊ฒŒ ๋ฏธ๋ฆฌ ๋งํ•˜์ž๋ฉด ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(Convolution Layer)๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ณผ์ •์—์„œ 3x3 ์ปค๋„์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ์ด ๋•Œ, ์ด๋Ÿฌํ•œ ์ปค๋„์ด ์ด๋ฏธ์ง€ ์œ„์—์„œ ์›€์ง์—ฌ๊ฐ€๋ฉฐ ํ•ฉ์„ฑ๊ณฑ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ ๋งจ ๊ฐ€์ชฝ์— ์žˆ๋Š” edge(๊ฒฝ๊ณ„)์˜์—ญ์˜ ํ”ฝ์…€์—๋Š” ์˜†์— ๊ณต๊ฐ„์ด ์—†๊ธฐ์— ์ปค๋„์ด ์˜ฌ๋ผ๊ฐ€์ง€ ๋ชปํ•ด ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ์‚ฐ์ด ๋˜์ง€์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ถ€๋ถ„๋งŒํผ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ๋กœ Tensorflow์—์„œ์˜ ํ•จ์ˆ˜๋Š”

Conv2D(1,(3, 3),input_shape = (7,7,3), activation = 'relu')

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


Padding(ํŒจ๋”ฉ)

๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด ์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด Image์— ๊ฐ€์ƒ์˜ ํ”ฝ์…€์„ ์ฑ„์›Œ ๊ฐ€์žฅ์ž๋ฆฌ ์˜์—ญ๋˜ํ•œ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ ๊ทธ๋ฆผ์—์„œ๋Š” 5x5 input image์— ๋Œ€ํ•ด์„œ padding์„ ์ ์šฉํ•˜์˜€๊ธฐ์— ๊ฒฐ๊ณผ๊ฐ€ 5x5 ํฌ๊ธฐ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.

padding์˜ ์ข…๋ฅ˜

padding์„ ํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์˜†์˜ ํ”ฝ์…€์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ƒฅ 0์œผ๋กœ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•(zero padding)๋“ฑ์ด ์žˆ๋‹ค.
์˜์ƒ์ฒ˜๋ฆฌ ํŒŒํŠธ์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ ์ œ๋Œ€๋กœ ๋‹ค์‹œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Stride

์ปค๋„์„ ์›€์ง์ด๋Š” ๋ณดํญ size๋ฅผ ๋œปํ•œ๋‹ค.

์›€์ง์ด๋Š” ๋ณดํญ์„ 2์นธ์”ฉ ์ด๋™ํ•˜๋‹ˆ ๋‹น์—ฐํžˆ ์ค‘๊ฐ„์—์„œ ์—ฐ์‚ฐ์ด ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธด๋‹ค.
์—ฐ์‚ฐ์ด ๋˜์ง€์•Š์œผ๋ฉด ๊ฒฐ๊ณผ ์˜์ƒ์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, padding์„ ํ•˜๋”๋ผ๋„ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

padding๊ณผ stride์˜ ๊ด€๊ณ„

padding์„ ํ•œ๋‹ค๊ณ ํ•ด์„œ ๋”ฐ๋ผ์„œ ์˜์ƒ์ด ํ•ญ์ƒ ์ค„์–ด๋“ค์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. stride๊ฐ€ = 2 ์ด์ƒ์œผ๋กœ ์ ์šฉ๋  ์‹œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด padding ์‹œ์—๋„ ์˜์ƒ์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

  • stride = 1 (padding ์‹œ, ์˜์ƒ์˜ ํฌ๊ธฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜์˜ค๊ฒŒ ๋จ)
  • stride = 2 (padding ์‹œ์—๋„ ์˜์ƒ์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ฌ)

์ˆซ์ž๋Š” ์ž„์˜๋กœ ํ‘œ๊ธฐํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ˆซ์ž๋Š” ๋”ฐ๋กœ ํฌ๊ฒŒ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ธธ ๋ฐ”๋ž€๋‹ค.


Convolution Layer ์ดํ›„ ์˜์ƒ์˜ ํฌ๊ธฐ ๋ฐ ํ•™์Šต๋˜๋Š” param์˜ ์ˆ˜

์˜์ƒ์˜ ํฌ๊ธฐ

Wโˆ’F+2PSW - F + 2P \over {S}+1 ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์‹์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

param์˜ ์ˆ˜(ํ•™์Šต๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ˆ˜)

ํ•™์Šต๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "์ปค๋„" ์ด ํ•™์Šต๋˜๋Š” ๊ฒƒ์— ์œ ์˜ํ•˜๋ฉฐ ๊ตฌํ•˜๋ฉด ์‰ฝ๋‹ค.
(7x7)์ปค๋„์„ 64๊ฐœ ์‚ฌ์šฉํ•˜๊ณ  input_shape๊ฐ€ (5x5x1) ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

(์ปค๋„ ๊ฐ€๋กœ) x (์ปค๋„ ์„ธ๋กœ) x (์ปค๋„์˜ ์ˆ˜) x (input shape์˜ depth) + ํ•ด๋‹น ์ปค๋„์˜ bias ์ˆ˜

7 x 7 x 64 x 1 + 64 = 3,200

์—ฌ๊ธฐ์„œ ์ปค๋„์ด ํ•™์Šต๋˜๋‹ˆ ์ปค๋„์— ์ด 3x3๊ฐœ์˜ ๊ฐ’ ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ปค๋„์ด ์ด 32๊ฐœ
depth๊ฐ€ 1๊นŒ์ง€๋Š” ์‰ฌ์šด๋ฐ, bias๋Š” ๋ฌด์—‡์ผ๊นŒ?

bias๋ž€ ์ปค๋„๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๋ถ™๋Š” ํŽธํ–ฅ์น˜ ๊ฐ’์ด๋‹ค.
๋”ฐ๋ผ์„œ ์ปค๋„์ด ์ด 32๊ฐœ ํ•™์Šต๋˜๋ฏ€๋กœ ์ตœ์ข… ๊ฐ’์— 32๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ปค๋„์ด ํ•™์Šต๋˜๋ฏ€๋กœ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ(28x28)๋Š” param์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•˜์ž.


์‹ค์ œ Tensorflow์—์„œ์˜ param ๊ฐœ์ˆ˜

conv2D

ํ•ด๋‹น ์˜ˆ์ œ์˜ 2๋ฒˆ์žฌ Conv2D ์—ฐ์‚ฐ์„ ๋ณด์ž.
์ปค๋„์ด 3X3, ์ปค๋„์˜ ์ˆ˜ 64, input์œผ๋กœ ๋“ค์–ด์˜ค๋Š” depth๋Š” 32๊ฐ€ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ 3 x 3 x 64 x 32 = 18,432 ๊ฐœ์˜ param์ด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ปค๋„์˜ ์ˆ˜ ๋งŒํผ bias๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ 64๋ฅผ ๋”ํ•ด์ค€๋‹ค๋ฉด?
์ตœ์ข…์ ์œผ๋กœ 18,496์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Flatten

๊ทธ๋Ÿผ ์ข€ ๋” ์•„๋ž˜์ชฝ flatten์„ ๋ณด์ž
flatten์€ ๊ฐ„๋‹จํžˆ ํ˜„์žฌ ์ด๋ฏธ์ง€๋ฅผ 1์ฐจ์› ์—ด๋ฒกํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ€๋กœx์„ธ๋กœxdept๋ฅผ ๊ณฑํ•˜๋ฉด ๋œ๋‹ค.

12x12x64 = 9,216

Dense(Fully Connected Layer)

์ดํ›„ dense๋ฅผ ์‚ดํŽด๋ณด๋ฉด 128๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

FC์™€๋Š” Conv2D๋Š” ๊ตฌํ•ด์ง€๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‰ฝ๋‹ค.

FC๋Š” ๋“ค์–ด์˜ค๋Š” ์ธต์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ X ํ˜„์žฌ ์ธต์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜ + bias์˜ ์ˆ˜๋กœ ๊ตฌํ•ด์ง„๋‹ค.
์—ฌ๊ธฐ์„œ์˜ bias๋Š” ์ปค๋„์˜ ์ˆ˜์™€ ๊ฐ™์ด ํ•ด๋‹น dense layer์—์„œ์˜ ๋…ธ๋“œ ์ˆ˜์™€ ๊ฐ™๋‹ค.

๋”ฐ๋ผ์„œ 9216 x 128 + 128(node๋ณ„ bias์˜ ๊ฐœ์ˆ˜)๋ฅผ ํ†ตํ•ด 1,179,776์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์‹ค 9216 + 1 x 128๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋‚˜, ์‹์„ ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์ €๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Dense๋งŒ์„ ์‚ฌ์šฉํ•œ ๋ชจ๋ธ์˜ ์˜ˆ์ œ

์ธํ’‹ x ์•„์›ƒ ํ’‹(ํ˜„์žฌ ๊ฐœ์ˆ˜) + ํ˜„์žฌ ์ธต์˜ bias ์ˆ˜

  • 60 x 24 + 24 = 1464
  • 24 x 10 + 10 = 250
  • 10 x 1 + 1 = 11

Pooling Layer

์˜๋ฏธ

๋ถ„๋ฅ˜๋ฅผ ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž…๋ ฅ feature map์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค.
์ฆ‰, ์ถ”์ถœ๋œ feature์ค‘์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ๋งŒ ์ถ”์ถœํ•˜๊ฒ ๋‹ค.
(์ด๋ฅผ ํ†ตํ•ด ์ˆ˜์‹์˜ ์—ฐ์‚ฐ๋Ÿ‰๋˜ํ•œ ๊ฐ์†Œํ•˜๋Š” ํšจ๊ณผ๋˜ํ•œ ๊ฐ€์ง„๋‹ค.)

ํŠน์ง•

  • ์ถ”์ถœ๋œ feature์—์„œ ์š”์•ฝ ํ†ต๊ณ„๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค.
  • ํŠน์ง• ๋งต์˜ ํฌ๊ธฐ๋Š” ์ค„์–ด๋“œ๋‚˜, ๊ทธ ๊ฐœ์ˆ˜๋Š” ์œ ์ง€ํ•œ๋‹ค. ex.) (24, 24, 3) -> (12, 12, 3)
  • ์ž‘์€ ์ด๋™์—(์‚ฌ์†Œํ•œ ๋ถ€๋ถ„์˜ ๋ณ€ํ™”) ๋‘”๊ฐํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌผ์ฒด ์ธ์‹, ์˜์ƒ ๊ฒ€์ƒ‰๋“ฑ์— ํšจ๊ณผ์ ์ด๋‹ค.

์ข…๋ฅ˜

์˜ˆ์‹œ(ํ‰๊ท  ํ’€๋ง)


Code ์‹ค์Šต (Mnist data)

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy
import os
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.callbacks import ModelCheckpoint,EarlyStopping
# seed ๊ณ ์ •
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
# ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ / ๋‚˜๋ˆ„๊ธฐ
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255
Y_train = np_utils.to_categorical(Y_train)
Y_test = np_utils.to_categorical(Y_test)
# ์ปจ๋ณผ๋ฃจ์…˜ ์‹ ๊ฒฝ๋ง(ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง) ์„ค์ •
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropyโ€™, optimizer='adamโ€™, metrics=['accuracy'])
# ๋ชจ๋ธ ์ตœ์ ํ™” ์„ค์ •
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1,
save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# ๋ชจ๋ธ ์‹คํ–‰ 
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, 
batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])
# ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ •ํ™•๋„ ์ถœ๋ ฅ
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
# ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„
y_loss = history.history['loss']
y_vloss = history.history['val_loss']
# ๊ทธ๋ž˜ํ”„์— ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ฃผ๊ณ  ๋ ˆ์ด๋ธ”์„ ํ‘œ์‹œ
x_len = numpy.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

๊ฒฐ๊ณผ

๋ถ„๋ฅ˜ํ•˜์ง€ ๋ชปํ•œ Mnist data

profile
๋ถ‰์€ ๋ฐฐ ์˜ค์ƒ‰ ๋”ฑ๋‹ค๊ตฌ๋ฆฌ ๊ฐœ๋ฐœ์ž ๐ŸฆƒCloud & DevOps

0๊ฐœ์˜ ๋Œ“๊ธ€