๐ค 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)
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
๊ณผ๋์ ํฉ ํ์์ด ํ์ฐํ ์ค์ด๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
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 ๊ธฐ๋ณธ ๋ ์ด์ด ๊ตฌ์ฑ๊ณผ ๋ฐ์ดํฐ์ฆ๊ฐ ๊ธฐ๋ฒ์ ์์๋ณด์์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ต๋๋ค.
1) matplotlib.pyplot imread() ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
=> ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
2) PIL(Pillow) ๋ก ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ => PIL ๋ก ์ ๊ณ ๋๋ฆฌ๊ณ ๋ก๊ธฐ๊ณ ๊ฐ ๋ค ๊ฐ๋ฅํฉ๋๋ค. TF ๋ด๋ถ์์๋ PIL ์ด๋ OpenCV๋ฅผ ์ฌ์ฉํด์ ์ ๊ณ ๋๋ฆฌ๊ณ ๋ก๊ธฐ๊ณ ๋ฅผ ํฉ๋๋ค.
=> ์ด๋ฏธ์ง ํธ์ง๊ธฐ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
๐ก resize ๋ก ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
original.resize((150, 150))
3) OpenCV๋ก ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ(Computer Vision)์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋๊ตฌ๋ก ๋์์์ฒ๋ฆฌ ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ค์๊ฐ ์ปดํจํฐ ๋น์ ์ ๋ชฉ์ ์ผ๋ก ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ก ์ค์ต๋ชฉ์ : TF๊ณต์ ๋ฌธ์์ ์ด๋ฏธ์ง ๋ถ๋ฅ๋ฅผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด์ ์์ฉํด ๋ณด๋ ๊ฒ์ ๋๋ค.
ImageDataGenerator()
๊ฐ ์ง์ํ๋ ์ด๋ฏธ์ง ๋ณํ ์ ํ๊ณต๊ฐ ๋ ๋ฒจ ๋ณํ
ํฝ์ ๋ ๋ฒจ ๋ณํ
๐ค ์๋ณธ์ด๋ฏธ์ง์ ๋น๊ตํ์ ๋ ๊ถ์ฅํ๋ ์ด๋ฏธ์งํฌ๊ธฐ๋ ๋ฐ๋ก ์๋์?
์ด๋ฏธ์ง์ ์ฌ์ด์ฆ๋ ์์๋๋ก ํด๋ ์๊ด์์ง๋ง, ๋ฅ๋ฌ๋์ ๊ฒฝ์ฐ 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')
์ด๋ฏธ์ง ์ถ์ฒ: 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
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://github.com/rickiepark
Q: ํค๋ฆฝ ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐํ๋๋ฐ ์ด ์ด๋ฏธ์ง๋ฅผ ํ์ตํ์ ๋ ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊น์?
A: ์ด๋ฏธ์ง๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ ๋๋ ์ ์ฒ๋ฆฌ๊ฐ ์ค์ํฉ๋๋ค. ์ข์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ์ต๊ฒฐ๊ณผ๊ฐ ์ข๊ฒ ๋์ต๋๋ค.
Q: pooling์ stride๊ฐ ๊ณ ์ ์ธ๊ฐ์?
A: stride ๊ฐ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
Q: ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ณ ๋จ์ ์ convolution ๊ตฌ์กฐ์์ ๋ค์ํ ์ค์ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด์ ๊ฐ๋ฅํ๊ฐ์?
A: ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ ํ์ดํผํ๋ผ๋ฏธํฐ์ฒ๋ผ ์กฐ์ ์ ํ๋ฉด ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๊ณ Conv, Pooling ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค๋๋ค. ์ด๋ค์์ผ๋ก ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ๋์ ๋ฐ๋ผ ๋ณด์์ด ๊ฐ๋ฅํ๊ธฐ๋ ํฉ๋๋ค.
Q: ๋ง์ง๋ง epochs์์ metrics๊ฐ ๋จ์ด์ก์ผ๋ฉด ์ต์ข
๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ ๋ง์ง๋ง epochs๋ก ์ธํ
๋๋์ metrics๊ฐ ๊ฐ์ฅ ์ข์ ๋ ๊ธฐ์ค์ผ๋ก ์ธํ
๋๋์?
A: ๋ง์ง๋ง์ ํ์ตํ ๊ฒฐ๊ณผ๋ก ์์ธกํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํผํ
์ด ๋์๋์ง ํ์ต, ๊ฒ์ฆ ์
์ ๋น๊ตํด ๋ณด๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.