[ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] LeNet ์‹ค์Šต-Fashoin MNIST ๋ถ„๋ฅ˜ ์‹ค์Šต

2025. 7. 13. 23:49ยท๐Ÿ“šbook

 

๊ธฐ๋ณธ ์ˆ™์ œ

๊ธฐ์กด: LeNet์œผ๋กœ Fashion MNIST ๋ถ„๋ฅ˜ ์‹ค์Šต ํ›„ ์˜ˆ์ธก ๊ฒฐ๊ณผ ํ™”๋ฉด ์บก์ฒ˜

์ •์ •: ๋ชจ๋ธ ์„ฑ๋Šฅ ํ™•์ธ ๊ทธ๋ž˜ํ”„ ์บก์ณ

 


โœ๏ธ๊ฐœ๋… ์ •๋ฆฌ

ํ™œ์„ฑํ™” ํ•จ์ˆ˜

๊ฐ ๋‰ด๋Ÿฐ์˜ ์ถœ๋ ฅ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜

ํ™œ์„ฑํ™” ํ•จ์ˆ˜(activation function)๋Š” ๊ฐ ๋‰ด๋Ÿฐ์˜ ์ถœ๋ ฅ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋น„์„ ํ˜• ํ•จ์ˆ˜์— ํ†ต๊ณผ์‹œ์ผœ ๋น„์„ ํ˜•์ ์ธ ์ถœ๋ ฅ์„ ๋งŒ๋“ ๋‹ค. 

๐Ÿ“Œ๋น„์„ ํ˜• ํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ์‹ ๊ฒฝ๋ง์€ ์„ ํ˜• ๋ชจ๋ธ๊ณผ ๋‹ค๋ฅผ ๋ฐ”๊ฐ€ ์—†์œผ๋ฉฐ, ์•„๋ฌด๋ฆฌ ์ธต์„ ๋งŽ์ด ์Œ“์•„๋„ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

 

์™œ ๋น„์„ ํ˜• ํ•จ์ˆ˜์—ฌ์•ผ ํ• ๊นŒ?

์„ ํ˜• ํ•จ์ˆ˜๋Š” y = ax + b์˜ ํ˜•ํƒœ์ด๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ ์Œ“์•„๋„ ๊ฒฐ๊ตญ ์„ ํ˜•์ด๋‹ค.

1์ธต: yโ‚ = aโ‚x + bโ‚
2์ธต: yโ‚‚ = aโ‚‚yโ‚ + bโ‚‚ = aโ‚‚(aโ‚x + bโ‚) + bโ‚‚ = (aโ‚‚aโ‚)x + (aโ‚‚bโ‚ + bโ‚‚)

์œ„์ฒ˜๋Ÿผ, ๊ฒฐ๊ตญ y = ax + b์˜ ๋‹จ์ˆœํ•œ ์„ ํ˜• ๋ณ€ํ™˜์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

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

 

โœ…Sigmoid

f(x) = 1 / (1 + e^(-x))
  • ์ถœ๋ ฅ ๋ฒ”์œ„: (0, 1)
  • ํ™•๋ฅ ์ฒ˜๋Ÿผ ํ•ด์„ ๊ฐ€๋Šฅ
  • S์ž ํ˜•ํƒœ์˜ ๊ณก์„ 
  • ๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•œ ์—ฐ์† ํ•จ์ˆ˜

Sigmoid ํ•จ์ˆ˜๋Š” ์ถœ๋ ฅ๊ฐ’์ด 0๊ณผ 1์‚ฌ์ด์˜ ํ™•๋ฅ  ๋ฒ”์œ„์— ์žˆ์–ด ๊ฒฐ๊ณผ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋˜ํ•œ ๋ถ€๋“œ๋Ÿฌ์šด S์ž ๊ณก์„  ํ˜•ํƒœ๋กœ ์—ฐ์†์ ์ด๊ณ  ๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•˜์—ฌ ์•ˆ์ •์ ์ธ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ดˆ๊ธฐ ์‹ ๊ฒฝ๋ง ์—ฐ๊ตฌ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ž…๋ ฅ๊ฐ’์ด ๋งค์šฐ ํฌ๊ฑฐ๋‚˜ ์ž‘์„ ๋•Œ ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์— ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊นŠ์€ ๋„คํŠธ์›Œํฌ์—์„œ ํ•™์Šต์ด ์–ด๋ ค์›Œ์ง„๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์ถœ๋ ฅ์ด ์–‘์ˆ˜๋ผ์„œ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ ๋ฐฉํ–ฅ์ด ์ œํ•œ๋˜๊ณ , ์ง€์ˆ˜ ํ•จ์ˆ˜ ๊ณ„์‚ฐ์œผ๋กœ ์ธํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

โœ…ReLU(Rectified Linear Unit)

f(x) = max(0, x)
  • ์–‘์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ, ์Œ์ˆ˜๋Š” 0์œผ๋กœ
  • CNN์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ํ™œ์„ฑํ™” ํ•จ์ˆ˜

ReLU๋Š” ๋‹จ์ˆœํ•œ max ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด๋‹ค. ์–‘์ˆ˜ ์˜์—ญ์—์„œ ๊ธฐ์šธ๊ธฐ๊ฐ€ 1๋กœ ์ผ์ •ํ•˜์—ฌ ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ๋ฅผ ํฌ๊ฒŒ ์™„ํ™”ํ–ˆ์œผ๋ฉฐ, ์Œ์ˆ˜ ๋‰ด๋Ÿฐ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ํฌ์†Œํ•œ ํ‘œํ˜„์„ ๋งŒ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค. 

ํ•˜์ง€๋งŒ ์Œ์ˆ˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ด ๋˜์–ด ๋‰ด๋Ÿฐ์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š” dead ReLU ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ํ•™์Šต ๊ณผ์ •์—์„œ ์ผ๋ถ€ ๋‰ด๋Ÿฐ์ด ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ๋„คํŠธ์›Œํฌ์˜ ํ‘œํ˜„๋ ฅ์ด ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ์ „ํžˆ ์ถœ๋ ฅ์ด 0 ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

 

โœ…softmax

f(xแตข) = e^(xแตข) / Σโฑผ e^(xโฑผ)
  • ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•๋ฅ  ๋ถ„ํฌ๋กœ ๋ณ€ํ™˜
  • ๋ชจ๋“  ์ถœ๋ ฅ๊ฐ’์˜ ํ•ฉ์ด 1
  • ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ™•๋ฅ ๋กœ ํ•ด์„ ๊ฐ€๋Šฅ

์‚ฌ์šฉ๋ชฉ์ :

  • ์ถœ๋ ฅ์ธต์—์„œ ์‚ฌ์šฉ: ๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜์˜ ์ตœ์ข… ๋‹จ๊ณ„
  • ํ™•๋ฅ  ํ•ด์„: ๊ฐ ํด๋ž˜์Šค๋ณ„ ์˜ˆ์ธก ํ™•๋ฅ  ์ œ๊ณต
  • CrossEntropy Loss์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ: ๋ถ„๋ฅ˜ ๋ฌธ์ œ์˜ ํ‘œ์ค€ ์กฐํ•ฉ

softmax ํ•จ์ˆ˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ํ™•๋ฅ  ๋ถ„ํฌ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ ํด๋ž˜์Šค๋ณ„ ์˜ˆ์ธก ํ™•๋ฅ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ชจ๋“  ์ถœ๋ ฅ๊ฐ’์˜ ํ•ฉ๋‹ˆ 1์ด ๋˜์–ด ์ƒ๋Œ€์  ์ค‘์š”๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ˆ˜ํ•™์ ์œผ๋กœ ์•ˆ์ •์ ์ด๊ณ  ๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•˜์—ฌ ์—ญ์ „ํŒŒ ํ•™์Šต์— ์ ํ•ฉํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ ์ง€์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ ๋น„์šฉ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋†’๊ณ , ์ž…๋ ฅ๊ฐ’์ด ๊ทน๊ฐ’์„ ๊ฐ€์งˆ ๋•Œ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๋งค์šฐ ์ž‘์•„์ ธ ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํด๋ž˜์Šค ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ๊ณ„์‚ฐ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

โœ…ReLU์˜ ๋ณ€ํ˜• ํ•จ์ˆ˜

  • Leaky ReLU
  • ELU(Exponentail Linear Unit)

 

One-Hot Encoding

๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ(ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”)๋ฅผ ์‹ ๊ฒฝ๋ง์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹

์›-ํ•ซ ์ธ์ฝ”๋”ฉ์€ ์ •์ˆ˜ํ˜• ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋ฒกํ„ฐ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. softmax ์ถœ๋ ฅ๊ณผ ์ง์ ‘ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ”๋„ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

MNIST ์†๊ธ€์”จ ์ˆซ์ž ๋ถ„๋ฅ˜์—์„œ ์ˆซ์ž 3์„ ์›-ํ•ซ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

# ํด๋ž˜์Šค 3
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
  • ์ด 10๊ฐœ ํด๋ž˜์Šค(0-9)
  • ํ•ด๋‹น ์ธ๋ฑ์Šค๋งŒ 1์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ 0
  • ์ด ๋ฒกํ„ฐ๋Š” softmax ์ถœ๋ ฅ๊ณผ ์ง์ ‘ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ด๋ธ” ๋ฒกํ„ฐ์ด๋‹ค.

์™œ ํ•„์š”ํ• ๊นŒ?

์‹ ๊ฒฝ๋ง์€ ์ถœ๋ ฅ์ธต์—์„œ ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ™•๋ฅ (softmax ์ถœ๋ ฅ)์„ ๊ณ„์‚ฐํ•œ๋‹ค.

[0.02, 0.01, 0.04, 0.91, 0.01, 0.003, 0.005, 0.002, 0.007, 0.001]

์ด ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด, ๋ ˆ์ด๋ธ”๋„ ๋™์ผํ•œ ํ˜•์‹์˜ ๋ฒกํ„ฐ๋กœ ์ค€๋น„ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋ฒกํ„ฐ๊ฐ€ ์›-ํ•ซ ์ธ์ฝ”๋”ฉ๋œ ํ˜•ํƒœ์ด๋‹ค.

from tensorflow.keras.utils import to_categorical

labels = [3, 0, 4]  # ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”
one_hot = to_categorical(labels, num_classes=10)

print(one_hot)
# [[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
#  [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
#  [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]
๐Ÿ“Œ categorical_crossentropy๋ฅผ ์“ฐ๋ ค๋ฉด ๋ ˆ์ด๋ธ”์ด one-hot์ด์–ด์•ผ ํ•œ๋‹ค. ์ •์ˆ˜ ์ธ๋ฑ์Šค ๊ทธ๋Œ€๋กœ ์“ธ  ๋•sparse_categorical_crossentropy๋ฅผ ์“ด๋‹ค.

 

์ฝœ๋ฐฑ

ํ›ˆ๋ จ ์ค‘๊ฐ„์ค‘๊ฐ„ ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ
EarlyStopping ๊ฒ€์ฆ ์†์‹ค์ด ๋” ์ด์ƒ ๊ฐœ์„ ๋˜์ง€ ์•Š์œผ๋ฉด ์กฐ๊ธฐ ์ข…๋ฃŒ
ModelCheckpoint ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์•˜๋˜ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅ
ReduceLROnPlateau ์„ฑ๋Šฅ์ด ์ •์ฒด๋˜๋ฉด ํ•™์Šต๋ฅ ์„ ์ž๋™์œผ๋กœ ์ค„์ž„
TensorBoard ์‹œ๊ฐํ™” ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ด์คŒ
from tensorflow.keras.callbacks import EarlyStopping

early_stop = EarlyStopping(monitor='val_loss', patience=3)

model.fit(x_train, y_train,
          validation_split=0.2,
          epochs=50,
          callbacks=[early_stop])

 

์†์‹ค ํ•จ์ˆ˜

์†์‹ค ํ•จ์ˆ˜๋Š” ๋ชจ๋ธ์˜ ์˜ˆ์ธก๊ฐ’๊ณผ ์‹ค์ œ ์ •๋‹ต ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์ˆ˜์น˜๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋ชจ๋ธ์ด "์–ผ๋งˆ๋‚˜ ํ‹€๋ ธ๋Š”์ง€"๋ฅผ ์ธก์ •ํ•˜์—ฌ ํ•™์Šต ๊ณผ์ •์—์„œ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•œ๋‹ค. CNN์—์„œ ๋ถ„๋ฅ˜ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์ฃผ๋กœ Cross Entropy ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

โœ…Categorical Crossentropy

  • softmax ์ถœ๋ ฅ๊ณผ one-hot ์ธ์ฝ”๋”ฉ ์ •๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ์†์‹ค์„ ๊ณ„์‚ฐ
  • ํ™•๋ฅ  ๋ถ„ํฌ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ธก์ •
  • ๊ฐ’์ด 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์ข‹์€ ์˜ˆ์ธก์„ ์˜๋ฏธ
Loss = -Σ(y_true * log(y_pred))

 

์‚ฌ์šฉ ์กฐ๊ฑด:

  • ์ •๋‹ต์ด one-hot ์ธ์ฝ”๋”ฉ ํ˜•ํƒœ์—ฌ์•ผ ํ•œ๋‹ค
  • ์ถœ๋ ฅ์ธต์— softmax ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ํด๋ž˜์Šค(ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์„ ํƒ)
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

๐Ÿช„์‹ค์Šต

import keras
from keras import layers

lenet5 = keras.Sequential()
lenet5.add(layers.Input(shape=(28, 28, 1)))
lenet5.add(layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Flatten())
lenet5.add(layers.Dense(120, activation='sigmoid'))
lenet5.add(layers.Dense(84, activation='sigmoid'))
lenet5.add(layers.Dense(10, activation ='softmax'))
  • LeNet-5 ๊ตฌ์กฐ๋ฅผ Sequential API๋กœ ๊ตฌํ˜„ํ•œ ์ „์ฒด ๋ชจ๋ธ ์ •์˜ ๋ธ”๋ก
  • ์ž…๋ ฅ ์ด๋ฏธ์ง€: 28x28 ํ”ฝ์…€, ์ฑ„๋„ ์ˆ˜ 1
  • ์ด 9๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ

[ํ๋ฆ„]

์ž…๋ ฅ์ธต

  • 28x28 ํฌ๊ธฐ์˜ ํ‘๋ฐฑ ์ด๋ฏธ์ง€ ์ž…๋ ฅ

1์ฐจ ํ•ฉ์„ฑ๊ณฑ+ํ’€๋ง

  • conv2D: 6๊ฐœ์˜ 5x5 ํ•„ํ„ฐ ์ ์šฉ, padding='same', ํ™œ์„ฑํ™” ํ•จ์ˆ˜ sigmoid
  • AveragePooling2D: 2x2 ํ•„ํ„ฐ๋กœ ๋‹ค์šด ์ƒ˜ํ”Œ๋ง

2์ฐจ ํ•ฉ์„ฑ๊ณฑ+ํ’€๋ง

  • Conv2D: 16๊ฐœ์˜ 5x5 ํ•„ํ„ฐ ์ ์šฉ, ํ™œ์„ฑํ™” ํ•จ์ˆ˜ sigmoid
  • AveragePooling2D: 2x2 ํ•„ํ„ฐ๋กœ ๋‹ค์‹œ ๋‹ค์šด ์ƒ˜ํ”Œ๋ง

์™„์ „ ์—ฐ๊ฒฐ์ธต Fully Connected Layers

  • Flatten: 2D feature map์„ 1D ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜
  • Dense(120): 120๊ฐœ์˜ ๋‰ด๋Ÿฐ, sigmoid ํ™œ์„ฑํ™”
  • Dense(84): 84๊ฐœ์˜ ๋‰ด๋Ÿฐ, sigmoid ํ™œ์„ฑํ™”
  • Dense(10): 10๊ฐœ์˜ ๋‰ด๋Ÿฐ, softmax ์ถœ๋ ฅ => 10๊ฐœ์˜ ํด๋ž˜์Šค ํ™•๋ฅ ๋กœ ๋ณ€ํ™˜

 

lenet5.summary()

 

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_target)
print(train_input.shape, train_target.shape)
  • Keras์—์„œ ์ œ๊ณตํ•˜๋Š” Fashion MNIST ๋ฐ์ดํ„ฐ์…‹ ํ˜ธ์ถœ

 

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10, 10))
for i in range(10):
  axs[i].imshow(train_input[i], cmap='gray_r')
  axs[i].axis('off')
plt.show()
  • Fashion MNIST ํ›ˆ๋ จ ์ด๋ฏธ์ง€ 10์žฅ ์‹œ๊ฐํ™”

 

train_input = train_input.reshape(-1, 28, 28, 1)/255.0
  • ํ”ฝ์…€ ์ •๊ทœํ™” + ์ฐจ์› ๋ณ€๊ฒฝ
  • reshape(): CNN ์ž…๋ ฅํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜. - ์€ ์ƒ˜ํ”Œ ๊ฐœ์ˆ˜ ์ž๋™ ๊ณ„์‚ฐ
  • /255.0: ํ”ฝ์…€ ๊ฐ’์„ 0~1 ์‚ฌ์ด ์‹ค์ˆ˜๋กœ ์ •๊ทœํ™”ํ•˜์—ฌ ํ•™์Šต ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
from sklearn.model_selection import train_test_split
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_input, train_target, test_size=0.2, random_state=42)
  • train, test ์„ธํŠธ ๋ถ„๋ฆฌ
  • ์ „์ฒด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ์ค‘ 80%๋Š” train_scaled, 20%๋Š” val_scaled
  • ๊ณผ์ ํ•ฉ ์—ฌ๋ถ€ ํŒ๋‹จ์„ ์œ„ํ•ด validation ๋ฐ์ดํ„ฐ ๋ณ„๋„๋กœ ํ™•๋ณด
  • random_state=42: ํ•ญ์ƒ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„ํ• 
checkpoint_cb = keras.callbacks.ModelCheckpoint('lenet5-model.keras', save_best_only=True)
  • ๋ชจ๋ธ ์ฒดํฌํฌ์ธํŠธ ์ €์žฅ ์ฝœ๋ฐฑ
  • ๊ฒ€์ฆ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์•˜๋˜ ์‹œ์ ์˜ ๊ฐ€์ค‘์น˜๋งŒ ์ €์žฅ
  • ๋‚˜์ค‘์— ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์™€ ์„ฑ๋Šฅ ์žฌํ˜„ ๊ฐ€๋Šฅ
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)
  • ์กฐ๊ธฐ ์ข…๋ฃŒ ์ฝœ๋ฐฑ
  • patience=2: ๊ฒ€์ฆ ์„ฑ๋Šฅ์ด 2epoch ์ด์ƒ ํ˜•์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ํ•™์Šต ์ค‘๋‹จ
  • restore_best_weight=True: ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์•˜๋˜ ์ง€์ ์˜ ๊ฐ€์ค‘์น˜๋กœ ๋ณต์›
lenet5.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  • ๋ชจ๋ธ ์ปดํŒŒ์ผ
  • ๋ผ๋ฒจ์ด ์ •์ˆ˜ํ˜•์ด๋ฏ€๋กœ, sparse_categorical_crossentropy ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • metrics=['accuracy']: ์ •ํ™•๋„๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋กœ ์‚ฌ์šฉ
hist = lenet5.fit(
    train_scaled, train_target,
    epochs=20,
    validation_data=(val_scaled, val_target),
    callbacks=[checkpoint_cb, early_stopping_cb])
  • ๋ชจ๋ธ ํ›ˆ๋ จ ์ˆ˜ํ–‰

 

epochs=range(1, len(hist.history['loss'])+1)

fig, axs = plt.subplots(1, 2, figsize=(12, 4))
axs[0].plot(epochs, hist.history['loss'], label='Training Loss')
axs[0].plot(epochs, hist.history['val_loss'], label='Validation Loss')
axs[0].set_xticks(epochs)
axs[0].set_xlabel('Epochs')
axs[0].set_ylabel('Loss')
axs[1].plot(epochs, hist.history['accuracy'])
axs[1].plot(epochs, hist.history['val_accuracy'])
axs[1].set_xticks(epochs)
axs[1].set_xlabel('Epochs')
axs[1].set_ylabel('Accuracy')

plt.show()

'๐Ÿ“šbook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Luvit ํ•œ๋‹ฌ ์Šคํ„ฐ๋””] ์ƒˆ๋กœ์šด ์›น ๊ฐœ๋ฐœ์˜ ์‹œ์ž‘ ์Šค๋ฒจํŠธ #3  (1) 2025.07.20
[ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] ๊ฐ•์•„์ง€ ๊ณ ์–‘์ด ์‚ฌ์ง„ ๋ถ„๋ฅ˜ ์‹ค์Šต(AlexNet, VGGNet, ResNet)  (6) 2025.07.20
[Luvit ํ•œ๋‹ฌ ์Šคํ„ฐ๋””] ์ƒˆ๋กœ์šด ์›น ๊ฐœ๋ฐœ์˜ ์‹œ์ž‘ ์Šค๋ฒจํŠธ #2  (8) 2025.07.13
[ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] CNN ๊ตฌ์กฐ์™€ ๋™์ž‘ ์›๋ฆฌ์˜ ์ดํ•ด  (4) 2025.07.06
[Luvit ํ•œ๋‹ฌ ์Šคํ„ฐ๋””] ์ƒˆ๋กœ์šด ์›น ๊ฐœ๋ฐœ์˜ ์‹œ์ž‘ ์Šค๋ฒจํŠธ #1  (5) 2025.07.06
'๐Ÿ“šbook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Luvit ํ•œ๋‹ฌ ์Šคํ„ฐ๋””] ์ƒˆ๋กœ์šด ์›น ๊ฐœ๋ฐœ์˜ ์‹œ์ž‘ ์Šค๋ฒจํŠธ #3
  • [ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] ๊ฐ•์•„์ง€ ๊ณ ์–‘์ด ์‚ฌ์ง„ ๋ถ„๋ฅ˜ ์‹ค์Šต(AlexNet, VGGNet, ResNet)
  • [Luvit ํ•œ๋‹ฌ ์Šคํ„ฐ๋””] ์ƒˆ๋กœ์šด ์›น ๊ฐœ๋ฐœ์˜ ์‹œ์ž‘ ์Šค๋ฒจํŠธ #2
  • [ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] CNN ๊ตฌ์กฐ์™€ ๋™์ž‘ ์›๋ฆฌ์˜ ์ดํ•ด
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (173)
      • ๐Ÿ–ฅ๏ธdevelop (2)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (2)
      • ๐Ÿ“šbook (9)
        • npm Deep Dive (4)
      • ๐Ÿ“•review (33)
        • ์ฑ… (24)
        • ํ–‰์‚ฌ (1)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (87)
        • TIL (61)
        • ํ”„๋กœ์ ํŠธ (18)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[ํ˜ผ๊ณตํ•™์Šต๋‹จ 14๊ธฐ] LeNet ์‹ค์Šต-Fashoin MNIST ๋ถ„๋ฅ˜ ์‹ค์Šต
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”