개발학습일지

[AI] 딥러닝 Transfer Learning으로 사진분류하는 인공지능 만들기 본문

AI/Deep Learning

[AI] 딥러닝 Transfer Learning으로 사진분류하는 인공지능 만들기

처카푸 2024. 4. 23. 13:38

Transfer Learning으로 개, 고양이 사진분류하는 인공지능 만들기

 

Transfer Learning이란?

: 이미 학습이 완료된 인공지능을 가져다가 내 데이터로 다시 재학습해서 사용하는 것이다

 

이번학습에서 사용할 모델인,

MobileNetV2 이란?
모바일이나 임베디드에서도 실시간을 작동할 수 있게 모델이 경량화 되면서도

정확도 또한 많이 떨어지지 않게하여 속도와 정확도 사이의 트레이드 오프 문제를 어느정도 해결한 네트워크이다

 

트랜스퍼 러닝에 사용되는 모델들은 홈페이지에서 확인이 가능하다

https://www.tensorflow.org/api_docs/python/tf/keras/applications

 

Module: tf.keras.applications  |  TensorFlow v2.16.1

DO NOT EDIT.

www.tensorflow.org

 

 

트랜스퍼 러닝하기

- 학습이 잘된 모델을 가져와서 나의 문제에 맞게 활용 해야한다

- 학습이 잘된 모델의 헤드 모델은 제외하고 베이스 모델만 가져온다

- MobileNet (architecture that we use) supports: (96, 96), (128, 128), (160, 160), (192, 192), (224, 224)

import tensorflow as tf

# 만들려는 모델의 인풋 이미지는 컬러 이미지인 (128, 128, 3)으로 한다
IMG_SHAPE = (128, 128, 3)

# include_top= False 헤드모델 빼고 가져오기
base_model =  tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                                include_top=False,
                                                weights='imagenet')
# 베이스 모델 써머리 마지막 값
base_model.summary()
>>>
    =============================================
    Total params: 2257984 (8.61 MB)
    Trainable params: 2223872 (8.48 MB)
    Non-trainable params: 34112 (133.25 KB)
    ______________________________________________

 

base_model.summary() 하면 학습 가능한 파라미터(Trainable params)가 있다

가져온 모델의 베이스 모델 부분은 이미 1400만장 이상의 이미지로 학습이 잘 되어 있어서

이미지의 특징을 뽑아내는 역할을 잘 하고 있으므로 내 데이터로는 학습이 되지 않도록 한다

base_model.trainable = False
base_model.summary()
>>>마지막
    ==========================================
    Total params: 2257984 (8.61 MB)
    Trainable params: 0 (0.00 Byte)
    Non-trainable params: 2257984 (8.61 MB)
    ___________________________________________

 

헤드모델을 만들어준다

from keras.layers import Flatten, Dense
head_model = base_model.output

# ANN은 기존 시퀄셜(모델)을 만들어두고 레이어를 .add로 추가했다
# CNN은 전체구조 없이 가져와서 하는 작업이기 때문에 만드는 구조가 다르다
# 텐서플로우의 함수용 사용 방법

# 헤드모델 뒤에 플래튼을 붙인다
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'])

# 데이터 만들기
traing_datagen = ImageDataGenerator(rescale = 1/255.0, 
									width_shift_range=0.2)
test_datagen = ImageDataGenerator(rescale = 1/255.0)

train_generator = traing_datagen.flow_from_directory(train_dir, 
													 target_size=(128, 128), 
                                                     class_mode= 'binary', 
                                                     batch_size= 128)
test_generator = test_datagen.flow_from_directory(test_dir, 
												  target_size=(128, 128), 
                                                  class_mode= 'binary', 
                                                  batch_size= 128)

 

학습하고 평가한다

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

model.evaluate(test_generator)