ML (MachineLearning)

๋ฐ์ดํ„ฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ฆ๊ฐ•ํ•˜๊ณ  Transfer Learningํ•˜๊ธฐ

567Rabbit 2024. 4. 22. 18:08

                                                      BASE MODEL                                                                          HEAD MODEL     

 

- ํŠธ๋žœ์Šคํผ ๋Ÿฌ๋‹์€, ํ•™์Šต์ด ์ž˜ ๋œ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์™€์„œ ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ์— ๋งž๊ฒŒ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
ํ•™์Šต์ด ์ž˜ ๋œ ๋ชจ๋ธ์˜ base model๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค ์ฆ‰, head๋ชจ๋ธ์€ ๋นผ๊ณ  ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ head๋ชจ๋ธ์„ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

ํŠธ๋žœ์Šคํผ ๋Ÿฌ๋‹์˜ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

 

 

์„ค์น˜ํ•˜๊ธฐ

!pip install tensorflow-gpu==2.0.0.alpha0

!pip install tqdm

 

 

 

Dogs vs Cats dataset ๋‹ค์šด๋กœ๋“œ๋ฐ›๊ธฐ

 

!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O ./cats_and_dogs_filtered.zip

 

 

 

 

์ž„ํฌํŠธํ•˜๊ธฐ

import os
import zipfile
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# ํŒŒ์ด์ฌ์˜ ์ง„ํ–‰์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ด ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
from tqdm import tqdm_notebook

from tensorflow.keras.preprocessing.image import ImageDataGenerator

%matplotlib inline

 

 

 

 

 

์••์ถ•ํŒŒ์ผ ํ’€๊ธฐ

zipfile.ZipFile('/content/cats_and_dogs_filtered.zip').extractall()

 

 

์••์ถ•ํŒŒ์ผ์„ ํ’€๋ฉด, ํŒŒ์ผ์ด ์ด๋ ‡๊ฒŒ ๋œฌ๋‹ค.

 

 

 

 

 

์••์ถ•์„ ํ‘ผ ํด๋”(๊ฐ•์•„์ง€, ๊ณ ์–‘์ด ์‚ฌ์ง„์ด ๋“ค์–ด์žˆ๋Š” ํด๋”)๋ฅผ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๊ธฐ

 

train_dir = '/content/cats_and_dogs_filtered/train'

val_dir = '/content/cats_and_dogs_filtered/validation'

 

# ํŒŒ์ผ๋กœ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ, ๋ฉ”๋ชจ๋ฆฌ์— ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

 

 

 

 

 

์ด๋ฏธ ์ž˜ ๋œ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์™€ ํ—ค๋“œ ๋–ผ์–ด๋‚ด๊ธฐ

 

# ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๋ ค๋Š” ๋ชจ๋ธ์˜ ์ธํ’‹ ์ด๋ฏธ์ง€๋Š” 128ํ–‰ 128์—ด ์ปฌ๋Ÿฌ์ด๋ฏธ์ง€๋กœ ํ•œ๋‹ค

IMG_SHAPE = (128, 128, 3)

 

base_model = tf.keras.applications.MobileNetV2( input_shape = IMG_SHAPE

                                                                                , include_top = False # ํ—ค๋“œ ๋–ผ๊ธฐ

                                                                                 ,  weights = 'imagenet')

 

 

#๋ฒ ์ด์Šค๋ชจ๋ธ์„ Freezing์‹œํ‚จ๋‹ค

base_model.trainable = False

 

 

 

 

ํ—ค๋“œ ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

from keras.layers import Flatten, Dense

head_model = base_model.output

head_model = Flatten()(head_model)

head_model = Dense(128, 'relu')(head_model)

head_model = Dense(1, 'sigmoid')(head_model)

 

 

 

 

๋ฒ ์ด์Šค๋ชจ๋ธ๊ณผ ํ—ค๋“œ๋ชจ๋ธ ํ•ฉ์น˜๊ธฐ

from keras.models import Model

model = Model(inputs = base_model.input ,outputs = head_model)

 

 

 

 

๋ชจ๋ธ ์ปดํŒŒ์ผ ํ•˜๊ธฐ

 

from keras.optimizers import RMSprop

model.compile(RMSprop(0.0001), loss='binary_crossentropy', metrics=['accuracy'] )

 

 

 

 

๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์‹œํ‚ค๊ธฐ(Generators ์‚ฌ์šฉ)

 

์ด๋ฏธ์ง€๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋ณ€ํ˜•์‹œํ‚ค๊ณ  ์กฐ์ž‘์‹œ์ผœ์„œ ์ด๋ฏธ์ง€๋ฅผ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ์ƒ์„ฑํ•ด์ค€๋‹ค (๋ฐ์ดํ„ฐ ์ฆ๊ฐ•)
# shrear : ๋ˆ•ํžˆ๋‹ค. ์‚ฌ๋žŒ์ด ์„œ์„œ ์†๋“ค๊ณ ์žˆ๋Š” ์‚ฌ์ง„์„ ๋ˆ•ํžŒ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ˜•์‹œ์ผœ์„œ ์ด๋ฏธ์ง€ ์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค
# zoom : ์ด๋ฏธ์ง€๋ฅผ ์คŒ ์‹œํ‚จ๋‹ค
# flip : ์ด๋ฏธ์ง€ ์ขŒ์šฐ๋ฐ˜์ „์‹œํ‚จ๋‹ค  (horizontal_filp)์€ ์œ„์•„๋ž˜๋กœ ๋ฐ˜์ „์‹œํ‚จ๋‹ค vertical_flip์€ ์–‘์˜†์œผ๋กœ ๋ฐ˜์ „์‹œํ‚จ๋‹ค
# shift : ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์œ„ ์•„๋ž˜๋กœ ์ด๋™์‹œ์ผœ์„œ ์น˜์šฐ์ ธ์ง„ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค 
# rotation : ์ด๋ฏธ์ง€๋ฅผ ํšŒ์ „์‹œํ‚จ๋‹ค
# fill_mode : ํ”ฝ์…€์ด ๋น„์›Œ์ ธ์žˆ์œผ๋ฉด ์ฑ„์šฐ๋Š” ๊ฒƒ์ด๋‹ค

 

<์ด๋ฏธ์ง€ ์ฆ๊ฐ•์˜ ์˜ˆ์‹œ>

train_datagen = ImageDataGenerator(
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

 

# width_shift_range๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ขŒ์šฐ๋กœ , height_shift_range๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒํ•˜๋กœ ์›€์ง์ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค

 

 

train_datagen = ImageDataGenerator(rescale=1/255,
                   zoom_range=0.2,
                   width_shift_range=0.2,
                   height_shift_range=0.2)

 

# rescale ์ฝ”๋“œ๋Š” ํŒŒ์ผ์„ ๋„˜ํŒŒ์ด๋กœ ๋ฐ”๊ฟ”์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ ๊ฐ’ ๋ฒ”์œ„๋Š” 0์—์„œ 255์ด๋‹ค. ๋”ฐ๋ผ์„œ 255๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ”ผ์ฒ˜์Šค์ผ€์ผ๋งํ•˜๋ฉด ๋œ๋‹ค.  ex ) ImageDataGenerator(rescale= 1/255)

 

train_generator = train_datagen.flow_from_directory(train_dir,
                                  target_size=(128,128),
                                  class_mode='binary')
# target size๋Š” ์œ„์—์„œ ๋งŒ๋“  ๋ชจ๋ธ์˜ input_shape์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
# ๋ถ„๋ฅ˜๋ฌธ์ œ์—์„œ ํด๋ž˜์Šค๊ฐ€ ๋‘๊ฐœ๋ฉด binary์ด๋‹ค.

 

# train_generator์€ X_train, y_train๋ฅผ ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(train_dir์ด๋ฏ€๋กœ)

 

 

 

val(๋ชจ์˜๊ณ ์‚ฌ๊ฐ™์€ ๊ฐœ๋…) ๋˜ํ•œ ํ”ผ์ณ์Šค์ผ€์ผ๋ง ํ•ด์ค€๋‹ค 

val_datagen = ImageDataGenerator(rescale=1/255)
val_generator = val_datagen.flow_from_directory(val_dir,
                                  target_size=(128,128),
                                  class_mode='binary')

 

 

 

 

 

๋ชจ๋ธ ํ•™์Šต์‹œํ‚ค๊ธฐ

epoch_history = model.fit(train_generator,
                          epochs=5,
                          validation_data=val_generator)

 

 

import numpy as np
from google.colab import files
from keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys():

  # predicting images
  path = '/content/' + fn
  img = image.load_img(path, target_size=(128,128))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

  # print(x)

  images = np.vstack([x])

  images = images / 255

  # print(images)

  classes = model.predict(images, batch_size=10)
  print(classes[0])
  if classes[0]>0.5:
    print(fn + " is a dog")
  else:
    print(fn + " is a cat")

 

 

์‚ฌ์ง„ํŒŒ์ผ์„ ์„ ํƒํ•˜์—ฌ ๋„ฃ์œผ๋ฉด ๊ฐ•์•„์ง€์ธ์ง€ ๊ณ ์–‘์ด์ธ์ง€ ์‹๋ณ„ํ•˜๋Š” ๋ชจ๋ธ์ด ์™„์„ฑ๋œ๋‹ค.

 

 

 

 

ps.

 

Google์˜

Teachable Machine์„ ์“ฐ๋ฉด ๊ฐ„ํŽธํ•˜๋‹ค

 

https://teachablemachine.withgoogle.com/