[AIS7] DL (5)

BBakHyeยท2022๋…„ 12์›” 6์ผ
0

๐Ÿฆ AI SCHOOL 7๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
41/52
post-thumbnail

๋ฐฐ์šด ๋‚ด์šฉ ๋ณต์Šต

๐Ÿค” ReLU๋ฅผ ํ†ต๊ณผํ•œ ํ”ผ์ฒ˜๋งต์„ ๋ฌด์—‡์ด๋ผ ๋ถ€๋ฅผ๊นŒ์š”?
A: activation map

๐Ÿค” MaxPooling ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
A: ๊ฐ€๋กœ์„ธ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์ค„๊ณ , ์ผ์ •ํ•œ ์˜์—ญ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ํ•™์Šต์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๋Œ€์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌ์†๋„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

๐Ÿค” Softmax ๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ• ๊นŒ์š”?
๋ฉ€ํ‹ฐํด๋ž˜์Šค ๋ถ„๋ฅ˜์— ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ๊ฐ’์ด n๊ฐœ์˜ ํ™•๋ฅ ๋กœ ๋‚˜์˜ค๊ณ , n๊ฐœ์˜ ํ™•๋ฅ ๊ฐ’์˜ ํ•ฉ์ด 1 ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ํ™•๋ฅ ๊ฐ’์„ ํด๋ž˜์Šค์˜ ๋‹ต์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๊ฐ€์žฅ ํฐ ํ™•๋ฅ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ์š”?
np.argmax() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ํฐ ํ™•๋ฅ ๊ฐ’์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‹ต์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” binary ๋ถ„๋ฅ˜์—๋Š” ์ถœ๋ ฅ activation์œผ๋กœ ๋ฌด์—‡์„ ์‚ฌ์šฉํ• ๊นŒ์š”?
Sigmoid

๐Ÿค” Sigmoid์˜ ํŠน์ง•?
ํžˆ๋“  ๋ ˆ์ด์–ด์—์„œ activation ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์—ญ์ „ํŒŒ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ถ„๊ฐ’์ด 0์ด๋˜๋Š” ๊ธฐ์šธ๊ธฐ์†Œ์‹ค๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ถœ๋ ฅ์ธต์—์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ 0~1 ์‚ฌ์ด์˜ ํ™•๋ฅ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ž„๊ณ„๊ฐ’(๋ณดํ†ต์€ 0.5)์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

๊ฝƒ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ์‹ค์Šต

https://www.tensorflow.org/tutorials/images/classification

๐Ÿ“Œ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ๊ณ ์ •

# ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ๊ณ ์ •
batch_size = 32   # ์ผ๋ถ€ ์ด๋ฏธ์ง€๋งŒ ๋ถˆ๋Ÿฌ์™€์„œ ํ•™์Šต
img_height = 180
img_width = 180

train_ds = tf.keras.utils.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค ๋‹ค๋ฅด๋ฉด ๊ณ„์‚ฐ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด์ฆˆ๋„ ๋งž์ถฐ์ค„ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๐Ÿค” ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค ๋‹ค๋ฅผ ๋•Œ ์–ด๋–ค ์‚ฌ์ด์ฆˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”?
์ด๋ฏธ์ง€์‚ฌ์ด์ฆˆ๊ฐ€ ํด๋•Œ, ์ž‘์„๋•Œ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์‚ฐํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ณดํ†ต ์ •์‚ฌ๊ฐํ˜• ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

PIL , OpenCV ๋“ฑ์„ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์šฐ๋ฆฌ๊ฐ€ ํฌํ† ์ƒต์—์„œ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ์ค„์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ์กฐ์ •ํ•ด ์ค๋‹ˆ๋‹ค.

๐Ÿ“Œ ์„ฑ๋Šฅ์„ ๋†’์ด๋„๋ก ๋ฐ์ดํ„ฐ์„ธํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ

  • Dataset.cache()๋Š” ์ฒซ epoch ๋™์•ˆ ๋””์Šคํฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•œ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ์„ธํŠธ๊ฐ€ ๋ณ‘๋ชฉ ์ƒํƒœ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์„ธํŠธ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋†’์€ ์˜จ๋””์Šคํฌ ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Dataset.prefetch๋Š” ํ›ˆ๋ จํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๋ฐ ๋ชจ๋ธ ์‹คํ–‰์„ ์ค‘์ฒฉ์‹œํ‚ต๋‹ˆ๋‹ค.
AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

๐Ÿ“Œ Keras ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

num_classes = len(class_names)

model = Sequential([

# Rescaling ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ์Šค์ผ€์ผ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
  layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),

# Conv, MaxPooling: ํŠน์ง•์„ ์ฐพ๋Š” ๊ณผ์ •
  layers.Conv2D(filters=16, kernel_size=3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),   # ํ‰ํƒ„ํ™”
# ํ‰ํƒ„ํ™” ํ•˜๊ณ  ๋‚œ ํ›„์—” filters๊ฐ€ ์•„๋‹Œ units
  layers.Dense(units=128, activation='relu'),
  layers.Dense(num_classes)
])

๐Ÿค” ์™œ ๊ณผ๋Œ€์ ํ•ฉ ๋˜์—ˆ์„๊นŒ?

ํ•œ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋‹จ์ •ํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹๊ฒŒ ๋‚˜์˜จ ์ค‘์ ์ ์ธ ์ด์œ ๋ฅผ ์ฐพ๋Š”๋‹ค๋ฉด ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ์ด์ฆˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
ํ›ˆ๋ จ ์˜ˆ์ œ๊ฐ€ ์ ์„ ๋•Œ ๋ชจ๋ธ์€ ์ƒˆ๋กœ์šด ์˜ˆ์ œ์—์„œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ •๋„๊นŒ์ง€ ํ›ˆ๋ จ ์˜ˆ์ œ์˜ ๋…ธ์ด์ฆˆ๋‚˜ ์›์น˜ ์•Š๋Š” ์„ธ๋ถ€๊นŒ์ง€ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜„์ƒ์„ ๊ณผ๋Œ€์ ํ•ฉ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์ด ์ƒˆ ๋ฐ์ดํ„ฐ์„ธํŠธ์—์„œ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•

๐Ÿ’ก ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์ด๋ž€?
๊ณผ๋Œ€์ ํ•ฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ›ˆ๋ จ ์˜ˆ์ œ๊ฐ€ ์ ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์€ ์ฆ๊ฐ•ํ•œ ๋‹ค์Œ ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž„์˜ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธฐ์กด ์˜ˆ์ œ์—์„œ ์ถ”๊ฐ€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ‘๊ทผ๋ฒ•์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ์˜ ๋” ๋งŽ์€ ์ธก๋ฉด์„ ํŒŒ์•…ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜ํ™”๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

Keras ์ „์ฒ˜๋ฆฌ ๋ ˆ์ด์–ด tf.keras.layers.RandomFlip, tf.keras.layers.RandomRotation, tf.keras.layers.RandomZoom์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ์ด๋ฅผ ๋ชจ๋ธ ๋‚ด๋ถ€์— ํฌํ•จ์‹œํ‚ค๊ณ  GPU์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data_augmentation = keras.Sequential(
  [
    layers.RandomFlip("horizontal",
                      input_shape=(img_height,
                                  img_width,
                                  3)),
    layers.RandomRotation(0.1),
    layers.RandomZoom(0.1),
  ]
)

Output:

๐Ÿ’ก ์ฆ๊ฐ•๊ธฐ๋ฒ•๊ณผ dropout์„ ์‚ฌ์šฉํ•œ ํ›„์˜ output

๊ณผ๋Œ€์ ํ•ฉ ํ˜„์ƒ์ด ํ™•์—ฐํžˆ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ Summary

1) TF๊ณต์‹์˜ˆ์ œ์˜ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
2) ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์€ ๊ฝƒ 5๊ฐ€์ง€ ์ด๋ฏธ์ง€๋ฅผ ํ•™์Šตํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips'] 5๊ฐ€์ง€ ๊ฝƒ์„ ๋ถ„๋ฅ˜ํ•ด ๋ณด๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
3) ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ train, valid set ๋ฅผ ๋‚˜๋ˆ„์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
4) ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ดค๊ณ 
5) 0~1 ์‚ฌ์ด๋กœ ์ •๊ทœํ™” ํ•ด์ฃผ๋Š” ์˜ˆ์ œ๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค. => Rescaling ๋ ˆ์ด์–ด์— ์ถ”๊ฐ€ํ•ด ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
6) ๊ธฐ๋ณธ ๋ ˆ์ด์–ด๋กœ ํ•™์Šต์„ ํ–ˆ๋”๋‹ˆ ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹๊ฒŒ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. => ์ด๋ฏธ์ง€์— ๋…ธ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜์–ด์š”.
7) ํ›ˆ๋ จ ๊ณผ์ •์—์„œ ๊ณผ๋Œ€์ ํ•ฉ์„ ๋ง‰๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋ธ์— ๋“œ๋กญ์•„์›ƒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
8) tf.keras.layers.RandomFlip, tf.keras.layers.RandomRotation, tf.keras.layers.RandomZoom ์ด๋Ÿฐ ์ „์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ์„ฑํ•ด์„œ ํ•™์Šต์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
9) ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์˜ค๋ฒ„ํ”ผํŒ…์ด ์ค„์–ด๋“ ๊ฒƒ์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MNIST(์†๊ธ€์”จ ์ด๋ฏธ์ง€๋กœ 0~9 ์ˆซ์ž), FMNIST(์˜๋ฅ˜ 10๊ฐ€์ง€ ์ด๋ฏธ์ง€) ๋Š” ์ „์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ๋งŒ๋“ค์–ด๋„ 99% ๊นŒ์ง€์˜ Accuracy๊ฐ€ ๋‚˜์™”์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฝƒ ์ด๋ฏธ์ง€์—๋Š” ๋…ธ์ด์ฆˆ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— Accuracy ๊ฐ€ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•, Dropout์„ ํ–ˆ์„ ๋•Œ 0.6๋Œ€์—์„œ 0.7์ •๋„๋กœ ์ •ํ™•๋„๊ฐ€ ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.
=> ์ง€๊ธˆ๊นŒ์ง€ ํ•œ ์‹ค์Šต์€ TF๊ณต์‹์˜ˆ์ œ์— ์žˆ๋Š” CNN ๊ธฐ๋ณธ ๋ ˆ์ด์–ด ๊ตฌ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ์ฆ๊ฐ• ๊ธฐ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

1001 ์‹ค์Šต

๐Ÿ“Œ ์ด๋ฏธ์ง€ ๋กœ๋“œ ๋ฐฉ๋ฒ•

์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1) matplotlib.pyplot imread() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
=> ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋œ๋‹ค.

2) PIL(Pillow) ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ• => PIL ๋กœ ์ ‘๊ณ ๋Œ๋ฆฌ๊ณ ๋•ก๊ธฐ๊ณ ๊ฐ€ ๋‹ค ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. TF ๋‚ด๋ถ€์—์„œ๋„ PIL ์ด๋‚˜ OpenCV๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ณ ๋Œ๋ฆฌ๊ณ ๋•ก๊ธฐ๊ณ ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
=> ์ด๋ฏธ์ง€ ํŽธ์ง‘๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”ฝ์…€ ๋‹จ์œ„์˜ ์กฐ์ž‘
    • ๋งˆ์Šคํ‚น ๋ฐ ํˆฌ๋ช…๋„ ์ œ์–ด
    • ํ๋ฆผ, ์œค๊ณฝ ๋ณด์ • ๋‹ค๋“ฌ์–ด ์œค๊ณฝ ๊ฒ€์ถœ ๋“ฑ์˜ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ
    • ์„ ๋ช…ํ•˜๊ฒŒ, ๋ฐ๊ธฐ ๋ณด์ •, ๋ช…์•” ๋ณด์ •, ์ƒ‰ ๋ณด์ • ๋“ฑ์˜ ํ™”์ƒ ์กฐ์ •
    • ์ด๋ฏธ์ง€์— ํ…์ŠคํŠธ ์ถ”๊ฐ€

๐Ÿ’ก resize ๋กœ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

original.resize((150, 150))    

3) OpenCV๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•(Computer Vision)์— ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋กœ ๋™์˜์ƒ์ฒ˜๋ฆฌ ๋“ฑ์— ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ปดํ“จํ„ฐ ๋น„์ „์„ ๋ชฉ์ ์œผ๋กœ ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1002 ์‹ค์Šต (๋ง๋ผ๋ฆฌ์•„ ํ˜ˆ์•ก๋„๋ง ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ์‹ค์Šต)

๐Ÿ’ก ์‹ค์Šต๋ชฉ์ : TF๊ณต์‹ ๋ฌธ์„œ์˜ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜๋ฅผ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‘์šฉํ•ด ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โœ… Keras์˜ ImageDataGenerator() ๊ฐ€ ์ง€์›ํ•˜๋Š” ์ด๋ฏธ์ง€ ๋ณ€ํ™˜ ์œ ํ˜•

๊ณต๊ฐ„ ๋ ˆ๋ฒจ ๋ณ€ํ˜•

  • Flip : ์ƒํ•˜, ์ขŒ์šฐ ๋ฐ˜์ „
  • Rotation : ํšŒ์ „
  • Shift : ์ด๋™
  • Zoom : ํ™•๋Œ€, ์ถ•์†Œ
  • Shear : ๋ˆ•ํžˆ๊ธฐ

ํ”ฝ์…€ ๋ ˆ๋ฒจ ๋ณ€ํ˜•

  • Bright : ๋ฐ๊ธฐ ์กฐ์ •
  • Channel Shift : RGB ๊ฐ’ ๋ณ€๊ฒฝ
  • ZCA Whitening : Whitening ํšจ๊ณผ

๐Ÿค” ์›๋ณธ์ด๋ฏธ์ง€์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ถŒ์žฅํ•˜๋Š” ์ด๋ฏธ์ง€ํฌ๊ธฐ๋Š” ๋”ฐ๋กœ ์—†๋‚˜์š”?
์ด๋ฏธ์ง€์˜ ์‚ฌ์ด์ฆˆ๋Š” ์ž„์˜๋Œ€๋กœ ํ•ด๋„ ์ƒ๊ด€์—†์ง€๋งŒ, ๋”ฅ๋Ÿฌ๋‹์˜ ๊ฒฝ์šฐ Network ๋ชจ๋ธ์˜ ์ž…๋ ฅ ์‚ฌ์ด์ฆˆ์™€ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•˜๊ฒŒ ํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค! ์ฐธ๊ณ ๋กœ CNN์˜ ๋Œ€ํ‘œ์ ์ธ ๋ชจ๋ธ๋“ค์€ ๋„คํŠธ์›Œํฌ ์ž…๋ ฅ์‚ฌ์ด์ฆˆ๊ฐ€ 224 * 224์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค

๐Ÿ“Œ ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ์…‹ ๋งŒ๋“ค๊ธฐ

๐Ÿ’ก ํ•™์Šต ๋ฐ์ดํ„ฐ ์…‹ ๋งŒ๋“ค๊ธฐ
# flow_from_directory ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
# training ๋ฐ์ดํ„ฐ์…‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
# class_mode ์—๋Š” ์ด์ง„๋ถ„๋ฅ˜์ด๊ธฐ ๋•Œ๋ฌธ์— binary ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. => ๊ฐ์—ผ/๋น„๊ฐ์—ผ ๋ถ„๋ฅ˜

# class_mode: One of "categorical", "binary", "sparse",
#     "input", or None. Default: "categorical".
# subset: Subset of data ("training" or "validation")

trainDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                           target_size = (height, width),
                                           class_mode = 'binary',
                                           batch_size = 64,
                                           subset='training')

๐Ÿ’ก ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ์…‹ ๋งŒ๋“ค๊ธฐ
valDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                         target_size =(height, width),
                                         class_mode = 'binary',
                                         batch_size = 64,
                                         subset='validation')

๐Ÿ“Œ ๋ ˆ์ด์–ด ์„ค์ •

  • filters : ์ปจ๋ณผ๋ฃจ์…˜ ํ•„ํ„ฐ์˜ ์ˆ˜ >> ํ•„ํ„ฐ ์ˆ˜ = ํŠน์ง•๋งต ์ˆ˜
  • kernel_size : ์ปจ๋ณผ๋ฃจ์…˜ ์ปค๋„์˜ (ํ–‰, ์—ด) >> ํ•„ํ„ฐ ์‚ฌ์ด์ฆˆ
  • padding : ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
    • โ€˜validโ€™ : ์œ ํšจํ•œ ์˜์—ญ๋งŒ ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋Š” ์ž…๋ ฅ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ž‘์Šต๋‹ˆ๋‹ค.
    • โ€˜sameโ€™ : ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • input_shape : ๋ชจ๋ธ์—์„œ ์ฒซ ๋ ˆ์ด์–ด์—์„œ ์ •์˜ (height, width, channels)
  • activation : ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์„ค์ •
    • โ€˜linearโ€™ : ๋””ํดํŠธ ๊ฐ’, ์ž…๋ ฅ๋‰ด๋Ÿฐ๊ณผ ๊ฐ€์ค‘์น˜๋กœ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ
    • โ€˜reluโ€™ : rectifier ํ•จ์ˆ˜, ์€๋‹‰์ธต์— ์ฃผ๋กœ ์‚ฌ์šฉ
    • โ€˜sigmoidโ€™ : ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜, ์ด์ง„ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—์„œ ์ถœ๋ ฅ์ธต์— ์ฃผ๋กœ ์‚ฌ์šฉ
    • โ€˜softmaxโ€™ : ์†Œํ”„ํŠธ๋งฅ์Šค ํ•จ์ˆ˜, ๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—์„œ ์ถœ๋ ฅ์ธต์— ์ฃผ๋กœ ์‚ฌ์šฉ

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://d2l.ai/chapter_convolutional-neural-networks/lenet.html

๐Ÿค” ์ด ์ด๋ฏธ์ง€์—์„œ ํ”ผ์ฒ˜๋งต์€ ๋ช‡ ๊ฐœ ์ผ๊นŒ์š”?
2๊ฐœ (filter1 + filter2)

๐Ÿค” ์ด ์ด๋ฏธ์ง€์—์„œ kernel_size ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
4 x 4, output kernerl_size == 3 x 3

model = Sequential()

# ์ž…๋ ฅ์ธต
model.add(Conv2D(filters=16, kernel_size=(3,3), padding='valid',
                 activation='relu', input_shape=(height, width, 3)))
model.add(Conv2D(filters=16, kernel_size=(3,3), padding='same',
                 activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=1))

model.add(Conv2D(filters=16, kernel_size=(3,3), padding='same',
                 activation='relu'))
model.add(Conv2D(filters=16, kernel_size=(3,3), padding='same',
                 activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=1))

model.add(Dropout(0.2)) # 20%๋Š” 0์œผ๋กœ ๋Œ€์ฒดํ•ด์„œ ์˜ค๋ฒ„ํ”ผํŒ… ๋ฐฉ์ง€

# Fully-connected layer
model.add(Flatten())
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=32, activation='relu'))

# ์ถœ๋ ฅ์ธต
model.add(Dense(1, activation='sigmoid'))  # binary classifcation

๐Ÿ“Œ Summary

1) ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ wget ์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜จ๋ผ์ธ URL ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋…ผ๋ฌธ(ํ˜ˆ์•ก๋„๋ง ์ด๋ฏธ์ง€๋กœ ๋ง๋ผ๋ฆฌ์•„ ๊ฐ์—ผ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋…ผ๋ฌธ)์— ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์™”์Šต๋‹ˆ๋‹ค.
2) plt.imread ์™€ cv2(OpenCV) ์˜ imread ๋ฅผ ํ†ตํ•ด array ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‹œ๊ฐํ™”๋ฅผ ํ•ด์„œ ๊ฐ์—ผ๋œ ์ด๋ฏธ์ง€์™€ ์•„๋‹Œ ์ด๋ฏธ์ง€๋ฅผ ๋น„๊ตํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.
3) TF.keras์˜ ์ „์ฒ˜๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ train, valid set์„ ๋‚˜๋ˆ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
4) ์•ž์œผ๋กœ ํ•  ๋‚ด์šฉ์€ CNN ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑ, ์ปดํŒŒ์ผ ํ•˜๊ณ  ํ•™์Šตํ•˜๊ณ  ์ •ํ™•๋„(Accuray) ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์ฐธ๊ณ 

  • ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ(์‹œ๊ฐ„์ด๋‚˜ ์ˆœ์„œ๊ฐ€ ์ƒ๊ด€ ์—†์Œ): MLP (๋ฐ€์ง‘์ธต)
  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ(ํ‘๋ฐฑ ๋˜๋Š” ์ปฌ๋Ÿฌ): 2D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง
  • ์ŠคํŽ™ํŠธ๋กœ๊ทธ๋žจ ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ: 2D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์ด๋‚˜ ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง
  • ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ: 1D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์ด๋‚˜ ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง
  • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ(์‹œ๊ฐ„์ด๋‚˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•จ): 1D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์ด๋‚˜ ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง
  • ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ(์˜ˆ: 3D ์˜๋ฃŒ ์ด๋ฏธ์ง€): 3D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง
  • ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€์˜ ์‹œํ€€์Šค): 3D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(๋ชจ์…˜ ํšจ๊ณผ๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” ํŠน์„ฑ ์ถ”์ถœ์„ ์œ„ํ•ด ํ”„๋ ˆ์ž„ ๋ณ„๋กœ ์ ์šฉํ•œ 2D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง๊ณผ ๋งŒ๋“ค์–ด์ง„ ํŠน์„ฑ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ RNN์ด๋‚˜ 1D ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์˜ ์กฐํ•ฉ

๐Ÿค” ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์ด๋ž€?

ํ•ฉ์„ฑ๊ณฑ ์ธต์€ ์ž…๋ ฅ๋ฐ›์€ ํ…์„œ์—์„œ ๊ณต๊ฐ„์ ์œผ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ๊ธฐํ•˜ํ•™์  ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์—ฌ ๊ตญ๋ถ€์ ์ธ ๊ณต๊ฐ„ ํŒจํ„ด์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ๋ฐฉ์‹์€ ์ด๋™ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„ ํ‘œํ˜„์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์„ฑ๊ณฑ ์ธต์„ ๋งค์šฐ ๋ฐ์ดํ„ฐ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋ชจ๋“ˆํ™” ์‹œํ‚ต๋‹ˆ๋‹ค.
์œ„์™€ ๊ฐ™์€ ์•„์ด๋””์–ด๋Š” ์–ด๋–ค ์ฐจ์› ๊ณต๊ฐ„์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 1D(์‹œํ€€์Šค), 2D(์ด๋ฏธ์ง€๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹ˆ์ž๋งŒ ์‚ฌ์šด๋“œ ์ŠคํŽ™ํŠธ๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋น„์Šทํ•œ ํ‘œํ˜„), 3D(๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ) ๋“ฑ์ž…๋‹ˆ๋‹ค.
ํ…์„œํ”Œ๋กœ์šฐ์—์„œ๋Š” conv1d ์ธต์œผ๋กœ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , conv2d์ธต์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , conv3d ์ธต์œผ๋กœ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์€ ํ•ฉ์„ฑ๊ณฑ ์ธต๊ณผ ํ’€๋ง ์ธต์„ ์Œ“์•„์„œ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ’€๋ง ์ธต์€ ๊ณต๊ฐ„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด์ƒ˜ํ”Œ๋งํ•˜๊ณ  ์ด๋Š” ํŠน์„ฑ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ๋˜๋ฉด ํ›„์† ์ธต์ด ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์˜ ์ž…๋ ฅ ์ด๋ฏธ์ง€์—์„œ ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ๋ฐ”๋ผ๋ณด๋„๋ก ํŠน์„ฑ ๋งต์˜ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์œ ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.
ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์€ ๊ณต๊ฐ„์ ์ธ ํŠน์„ฑ ๋งต์„ ๋ฒกํ„ฐ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์ข…์ข… flatten ์ธต๊ณผ ์ „์—ญ ํ’€๋ง ์ธต์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ จ์˜ ๋ฐ€์ง‘์ธต(MLP)๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ถ„๋ฅ˜๋‚˜ ํšŒ๊ท€ ์ถœ๋ ฅ์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ฑ… ์ถ”์ฒœ

  • ๐Ÿ’ก ํ˜ผ๊ณต๋จธ์‹ ๋Ÿฌ๋‹ https://tensorflow.blog/hg-mldl/
    => ์‰ฌ์šด ์„ค๋ช…
  • ์ผ€๋ผ์Šค ์ฐฝ์‹œ์ž์—๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋”ฅ๋Ÿฌ๋‹ ๊ฐœ์ • 2ํŒ https://thebook.io/080315/
    => ๋‚ด์šฉ์ด ๋งŽ๊ณ  ์ดˆ๋ณด์ž๊ฐ€ ๋ณด๊ธฐ์—๋Š” ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ธ์ฆˆ์˜จ๋จธ์‹ ๋Ÿฌ๋‹ https://tensorflow.blog/handson-ml2/
    => ์‚ฌ์ดํ‚ท๋Ÿฐ๊ณผ TF๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋‘๊ป๊ณ  ์ž์„ธํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ https://tensorflow.blog/python-ml-2nd-revised/
    => ์‚ฌ์ดํ‚ท๋Ÿฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๊ณ  ๊ณต์‹๋ฌธ์„œ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๊ณต์‹๋ฌธ์„œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ฑ…์ž…๋‹ˆ๋‹ค.
  • ํŒŒ์ด์ฌ ๋จธ์‹ ๋Ÿฌ๋‹ ์™„๋ฒฝ ๊ฐ€์ด๋“œ http://www.yes24.com/Product/Goods/108824557

๐Ÿ–‡ ๋ฐ•ํ•ด์„ ๋‹˜ ๊นƒํ—™ https://github.com/rickiepark


๐Ÿ™‹๐Ÿปโ€โ™€๏ธ ์งˆ๋ฌธ

Q: ํŠค๋ฆฝ ์ด๋ฏธ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐํ–ˆ๋Š”๋ฐ ์ด ์ด๋ฏธ์ง€๋ฅผ ํ•™์Šตํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ์š”?

A: ์ด๋ฏธ์ง€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ• ๋•Œ๋„ ์ „์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•™์Šต๊ฒฐ๊ณผ๊ฐ€ ์ข‹๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.


๐Ÿฆ ์งˆ๋ฌธ

Q: pooling์€ stride๊ฐ€ ๊ณ ์ •์ธ๊ฐ€์š”?
A: stride ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q: ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ณ„ ๋‹จ์ ์„ convolution ๊ตฌ์กฐ์—์„œ ๋‹ค์–‘ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด์™„ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?
A: ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋„ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์กฐ์ •์„ ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์ง€๊ณ  Conv, Pooling ๋„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์–ด๋–ค์‹์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋ƒ์— ๋”ฐ๋ผ ๋ณด์™„์ด ๊ฐ€๋Šฅํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Q: ๋งˆ์ง€๋ง‰ epochs์—์„œ metrics๊ฐ€ ๋–จ์–ด์กŒ์œผ๋ฉด ์ตœ์ข… ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋งˆ์ง€๋ง‰ epochs๋กœ ์„ธํŒ…๋˜๋‚˜์š” metrics๊ฐ€ ๊ฐ€์žฅ ์ข‹์„ ๋•Œ ๊ธฐ์ค€์œผ๋กœ ์„ธํŒ…๋˜๋‚˜์š”?
A: ๋งˆ์ง€๋ง‰์— ํ•™์Šตํ•œ ๊ฒฐ๊ณผ๋กœ ์˜ˆ์ธกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ”ผํŒ…์ด ๋˜์—ˆ๋Š”์ง€ ํ•™์Šต, ๊ฒ€์ฆ ์…‹์„ ๋น„๊ตํ•ด ๋ณด๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.


โœ๏ธ TIL

  • ์‚ฌ์‹ค(Fact): CNN ์‹ค์Šต์„ ํ–ˆ๋‹ค.
  • ๋Š๋‚Œ(Feeling): ์ฝ”๋“œ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๋กœ ์‹ค์Šตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง‰์ƒ ํ˜ผ์ž ์ฝ”๋“œ๋ฅผ ์งœ๋ คํ•˜๋ฉด ํž˜๋“ค๊ฒƒ ๊ฐ™๋‹ค.
  • ๊ตํ›ˆ(Finding): ํž˜๋‚ด์ž.
profile
๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก โœ๏ธ

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