9 Sun

๋”ฅ๋Ÿฌ๋‹ CNN ์™„๋ฒฝ ๊ฐ€์ด๋“œ - Fundamental ํŽธ

Keras๋ฅผ ์ด์šฉํ•œ Conv2D์™€ Pooling ์ ์šฉ ์‹ค์Šต 01

Conv2D๋ฅผ ์“ธ๋•Œ์—๋Š” ๋ฌด์กฐ๊ฑด ์ž…๋ ฅ์„ 3์ฐจ์›์œผ๋กœ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • (H, W, C)

    • ์‹ค์Šต ์ฝ”๋“œ์—์„œ๋Š” Fashion MNIST ๋ฐ์ดํ„ฐ์…‹์„ ์“ฐ๊ณ  ์ด ๋ฐ์ดํ„ฐ์…‹์ด Gray Scale์ด๊ธฐ ๋•Œ๋ฌธ์— Channel = 1 ์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” 3์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

  • 2์ฐจ์›์œผ๋กœ ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

์ด ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ๋Š” 4์ฐจ์›์˜ Feature Map์ด ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ ์ด๋ฅผ 4์ฐจ์›์ด๋ผ๊ณ  ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์น˜๋ฅผ ์ œ์™ธํ•˜๊ณ  3์ฐจ์›์˜ Feature Map ์ด๋ผ๊ณ  ํ•œ๋‹ค.

1๊ฐœ์˜ ํ•„ํ„ฐ๋Š” 3์ฐจ์›์ด๋‹ค.

  • ์ปค๋„์˜ ์ง‘ํ•ฉ์„ ํ•„ํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์ปค๋„์€ 2์ฐจ์›

Keras๋ฅผ ์ด์šฉํ•œ Conv2D์™€ Pooling ์ ์šฉ ์‹ค์Šต 02

kernelSize * kernerSize * filters * channel ์ด ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋Š” 3 * 3 * 32 * 1 = 288 ์ด๋‹ค.

  • ์ด ๋•Œ bias 32๋ฅผ ๋”ํ•ด์คŒ์œผ๋กœ์จ ์ด 320์ด ๋œ๋‹ค

Conv2d_3 ๋ ˆ์ด์–ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 3 * 3 * 64 * 32 = 18,432

    • ์ด์ „ ๋ ˆ์ด์–ด์—์„œ ์ „ํ•ด์ค€ ์ฑ„๋„ ์ˆ˜๊ฐ€ 32๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์—

  • bias 64๋ฅผ ๋”ํ•ด์คŒ์œผ๋กœ์จ ์ด 18496์ด ๋œ๋‹ค.

์ด ํ›„ flatten(1์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜)์„ ๊ฑฐ์น˜๋ฉด 13 * 13 * 64 = 10,816 ์ด ๋œ๋‹ค.

dense๋Š” Fully Connected Network ์ด๋ฏ€๋กœ Input์ด 10,816์ด๊ณ  Output์ด 100์ด๋ฏ€๋กœ ์ด 1,081,600 + 100 = 1,081,700 ์˜ ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

CNN์„ ์ด์šฉํ•˜์—ฌ Fashion MNIST ์˜ˆ์ธก ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜๊ธฐ

Feature Extract ๊ณผ์ •์„ ๊ฑฐ์นœ๋’ค flatten์„ ๊ฑฐ์ณ dense layer๋ฅผ ๊ฑฐ์น  ๋•Œ ์˜ค๋ฒ„ํ”ผํŒ…์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋•Œ Dropout ๊ธฐ๋ฒ•์„ ์ ์šฉํ•œ๋‹ค.

  • FC Layer๋Š” ๋„ˆ๋ฌด ์ด˜์ด˜ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์„œ, ๊ต‰์žฅํžˆ ๊ณ ์ฐจ์›์˜ ๋ฐฉ์ •์‹์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜๊ณ  ๋”ฐ๋ผ์„œ ์ด ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ”ผํŒ…์ด ์ƒ๊ธด๋‹ค.

๋ณดํ†ต Dense ํ›„ ํ•œ๋‹ค.

  • MaxPooling์ด๋‚˜ Flatten ํ›„์—๋„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ž˜ ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

Conv2D()๋Š” ์ž…๋ ฅ์œผ๋กœ ๋ฐฐ์น˜๋ฅผ ์ œ์™ธํ•œ 3์ฐจ์› ์ž…๋ ฅ์„ ํ•ด์•ผํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ 2์ฐจ์›์œผ๋กœ ์ž…๋ ฅํ•ด๋„ 3์ฐจ์›์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค

    • (28, 28) => (28, 28, 1)

  • ๋ช…ํ™•ํ•˜๊ฒŒ๋Š” 3์ฐจ์› ์ž…๋ ฅ์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (๋น„๋ก Grayscale ์ด๋”๋ผ๋„)

๋‹ค์ฑ„๋„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ Convolution ์ ์šฉ ์ดํ•ด - 01

๋‹ค์‹œ ๊ฐ•์กฐ! Conv ์—ฐ์‚ฐ์€ ์ž…๋ ฅ ์ด๋ฏธ์ง€๋„ 3์ฐจ์› ์ถœ๋ ฅ๋˜๋Š” ํ”ผ์ฒ˜๋งต๋„ 3์ฐจ์›์ด๋‹ค.

  • ๋‹จ์ผ ํ•„ํ„ฐ๋„ 3์ฐจ์›

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋„์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ•„ํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.

    • CNN์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ 3์ฐจ์› ํ•„ํ„ฐ๋ฅผ ๊ฐœ๋ณ„ feature map์— ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • ํ•„ํ„ฐ์˜ ์ฑ„๋„ ์ˆ˜๋Š” ํ•ญ์ƒ ์ž…๋ ฅ ํ…์„œ์˜ ์ฑ„๋„ ์ˆ˜์™€ ๋™์ผํ•˜๋‹ค.

    • ๊ฐ™์ง€ ์•Š์œผ๋ฉด ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ ์ด๋ฏธ์ง€๊ฐ€ 3์ฐจ์› RGB ์ด๋ฏธ์ง€๋ผ๋ฉด ์ฒซ๋ฒˆ์งธ Conv ์—ฐ์‚ฐ์ด ๋  ๋•Œ์˜ ํ•„ํ„ฐ์˜ ์ฑ„๋„๋„ 3๊ฐœ.

  • ํ•„ํ„ฐ ํ•˜๋‚˜ ๋‹น ํ”ผ์ฒ˜๋งต์ด ํ•˜๋‚˜ ์ƒ๊ธด๋‹ค.

    • RGB ์ด๋ฏธ์ง€๋ผ์„œ ์ฑ„๋„์ด 3๊ฐœ๋‹ˆ๊นŒ ํ”ผ์ฒ˜๋งต์ด 3๊ฐœ ์ƒ๊ธด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ฐ ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ณผ๋ฌผ์ด 3๊ฐœ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์€ ๋งž๋‹ค. ์ด ๋•Œ ์ด ๊ฒฐ๊ณผ๋ฌผ์„ ๋ชจ๋‘ element wise ํ•˜๊ฒŒ ๋”ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ ๊ฒฐ๊ณผ๋ฌผ์ด ํ”ผ์ฒ˜๋งต์ด๋‹ค.

  • ๊ฒฐ๋ก ์ ์œผ๋กœ, ์ถœ๋ ฅ ํ”ผ์ฒ˜๋งต์˜ ์ฑ„๋„ ์ˆ˜๋Š” Conv๋ฅผ ์ ์šฉํ•œ ํ•„ํ„ฐ์˜ ๊ฐœ์ˆ˜๋กœ ๊ฒฐ์ •๋œ๋‹ค. (๋‹จ์ผ ํ•„ํ„ฐ์˜ ์ฑ„๋„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค)

๋‹ค์ฑ„๋„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ Convolution ์ ์šฉ ์ดํ•ด - 02

์ถœ๋ ฅ ํฌ๊ธฐ = (์ž…๋ ฅ ํฌ๊ธฐ - ์ปค๋„ ์‚ฌ์ด์ฆˆ ) / ์ŠคํŠธ๋ผ์ด๋“œ + 1

  • ์—ฌ๊ธฐ์„œ ํŒจ๋”ฉ์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •

    • ํŒจ๋”ฉ๊นŒ์ง€ ๊ณ ๋ คํ•œ ์‹์€ ๋‹ค์Œ ๊ฐ•์˜

์ปจ๋ณผ๋ฃจ์…˜(Convolution) ์ ์šฉ ์‹œ ์ถœ๋ ฅ ํ”ผ์ฒ˜๋งต์˜ ํฌ๊ธฐ ๊ณ„์‚ฐ ๊ณต์‹ ์ดํ•ด

์ถœ๋ ฅ ํฌ๊ธฐ = (์ž…๋ ฅ ํฌ๊ธฐ - ์ปค๋„ ์‚ฌ์ด์ฆˆ + 2 * ํŒจ๋”ฉ) ์ŠคํŠธ๋ผ์ด๋“œ + 1

  • ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจ๋”ฉ = 0, ์ŠคํŠธ๋ผ์ด๋“œ = 1์ผ ๊ฒฝ์šฐ I - F + 1์ด O ํฌ๊ธฐ

  • ์‹ค์ œ๋กœ ์ž…์ถœ๋ ฅ ํฌ๊ธฐ๋ฅผ ๋งž์ถฐ์ค„ ๋•Œ๋Š” ์ด๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

    • x = Conv2D(filters=1, kernel_size=3, strides=1, padding='same')(input_tensor)

    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด padding = 'same' ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ž…์ถœ๋ ฅ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๋‹ค.

  • ๊ทผ๋ฐ ์—ฌ๊ธฐ์—๋Š” stride๊ฐ€ ํ•ญ์ƒ 1์ด์–ด์•ผ ๋œ๋‹ค๋Š” ๊ฐ€์ •์ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ stride๊ฐ€ 2์ผ๋•Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

    • ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ 6 x 6 ์ธ๋ฐ๋„ ๋ถˆ๊ณผํ•˜๊ณ  ์ถœ๋ ฅ ํฌ๊ธฐ๋Š” 3 x 3 ์ด ๋œ๋‹ค.

input_tensor = Input(shape=(6, 6, 1))
x = Conv2D(filters=1, kernel_size=3, strides=2, padding='same')(input_tensor)
print('x.shape:', x.shape)
>>> x.shape(None, 3, 3, 1)
  • ๋งŒ์•ฝ 6x6 ์ž…๋ ฅ์— Stride 2, Padding 0์„ ์ ์šฉ์‹œ์— 2.5๊ฐ€ ๋œ๋‹ค.

    • ์ด ๊ฐ’์€ 2๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

    • 2๊ฐ€ ๋œ๋‹ค๋Š” ๋œป์€, 0.5 ๋งŒํผ์˜ ์ •๋ณด๋Š” ๋ฒ„๋ ค์กŒ๋‹ค๋Š” ๋œป์ด๋ฉฐ ์ด๋Š” ๊ณง, ์ปจ๋ณผ๋ฃจ์…˜์ด ์ž…๋ ฅ์˜ ์–‘๋์ชฝ์€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค.

  • ๋˜ํ•œ ํŒจ๋”ฉ์€ ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์„ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ด ๋•Œ ํŠœํ”Œํ˜•ํƒœ๋กœ ์ž…๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

    • ๋จผ์ € ์˜ค๋Š” ํŠœํ”Œ์€ UpDown, ๋‘๋ฒˆ์งธ ํŠœํ”Œ์€ LeftRight

    • padding=((1, 0), (0, 1))

      • (1, 0) => ์œ„์ชฝ๋งŒ ํŒจ๋”ฉ

      • (0, 1) => ์˜ค๋ฅธ์ชฝ๋งŒ ํŒจ๋”ฉ

input_tensor = Input(shape=(6, 6, 1))
padded_input = ZeroPadding2D(padding=((1, 0),(1,0)))(input_tensor)
x = Conv2D(filters=1, kernel_size=3, strides=2)(padded_input)
print('x.shape:', x.shape)

๋Œ€์นญ์„ฑ์„ ์œ„ํ•ด์„œ ๋ณดํ†ต ์ปค๋„์˜ ํฌ๊ธฐ๋Š” ํ™€์ˆ˜์ด๋‹ค

  • 3x3, 5x5, 7x7

  • ์ตœ๊ทผ์˜ CNN์€ ๋Œ€๋ถ€๋ถ„ 3x3 ์ปค๋„์„ ์‚ฌ์šฉํ•œ๋‹ค.

Last updated

Was this helpful?