군침이 싹 도는 코딩

Transfer Learning 본문

Python/Deep Learning

Transfer Learning

mugoori 2023. 1. 2. 17:04

트랜스퍼 러닝이란 잘 만들어진 인공지능 모델을 가져와

ANN만을 뒤에 붙여 우리가 가진 데이터를 학습시키는것이다

이때 트랜스퍼 러닝에 사용할 인공지능 모델은 학습이 불가능하게 만들어야 한다

 

 

 

base_model =  tf.keras.applications.MobileNetV2( input_shape= (128, 128, 3), include_top=False)

# 위 코드는 텐서플로우의 MobileNetV2 를 사용한다는 뜻이다

모바일넷v2의 인풋 쉐입은 (96,96), (128,128), (160,160), (192,192), (224,224) 만 사용 가능하다

헤드모델을 제외하고 가져오기 위해 파라미터 include_top=False를 써준다

 

 

 

 

base_model.summary()
>>>
''''
 block_16_project (Conv2D)      (None, 4, 4, 320)    307200      ['block_16_depthwise_relu[0][0]']
                                                                                                  
 block_16_project_BN (BatchNorm  (None, 4, 4, 320)   1280        ['block_16_project[0][0]']       
 alization)                                                                                       
                                                                                                  
 Conv_1 (Conv2D)                (None, 4, 4, 1280)   409600      ['block_16_project_BN[0][0]']    
                                                                                                  
 Conv_1_bn (BatchNormalization)  (None, 4, 4, 1280)  5120        ['Conv_1[0][0]']                 
                                                                                                  
 out_relu (ReLU)                (None, 4, 4, 1280)   0           ['Conv_1_bn[0][0]']              
                                                                                                  
==================================================================================================
Total params: 2,257,984
Trainable params: 2,223,872
Non-trainable params: 34,112
__________________________________________________________________________________________________

# 베이스 모델의 서머리를 찍어보면 학습할수 있는 데이터가 있다

이것을 학습이 불가능하게 해줘야 한다

 

 

 

 

 

base_model.trainable = False
base_model.summary()
>>>
''''
 block_16_project_BN (BatchNorm  (None, 4, 4, 320)   1280        ['block_16_project[0][0]']       
 alization)                                                                                       
                                                                                                  
 Conv_1 (Conv2D)                (None, 4, 4, 1280)   409600      ['block_16_project_BN[0][0]']    
                                                                                                  
 Conv_1_bn (BatchNormalization)  (None, 4, 4, 1280)  5120        ['Conv_1[0][0]']                 
                                                                                                  
 out_relu (ReLU)                (None, 4, 4, 1280)   0           ['Conv_1_bn[0][0]']              
                                                                                                  
==================================================================================================
Total params: 2,257,984
Trainable params: 0
Non-trainable params: 2,257,984
__________________________________________________________________________________________________

# trainable = False 를 사용해 학습이 불가능하게 해주고 서머리를 다시 찍어보니

학습이 가능한 데이터가 0개이다

 

 

 

 

from keras.layers import Flatten, Dense

head_model = base_model.output
head_model = Flatten()(head_model) # 이 표기법은 함수형 표기법이라고 하고 Flatten을 head_model 뒤에 붙인다는 뜻이다
head_model = Dense(128,'relu')(head_model)
head_model = Dense(1, 'sigmoid')(head_model)

# 뒤에 붙일 ANN을 만들어준다

평탄화 할 Flatten 과 히든레이어, 아웃풋레이어를 붙여주었다

 

 

 

 

from keras.models import Model

model = Model(inputs= base_model.input , outputs = head_model)
model.summary()
>>>
''''
 Conv_1 (Conv2D)                (None, 4, 4, 1280)   409600      ['block_16_project_BN[0][0]']    
                                                                                                  
 Conv_1_bn (BatchNormalization)  (None, 4, 4, 1280)  5120        ['Conv_1[0][0]']                 
                                                                                                  
 out_relu (ReLU)                (None, 4, 4, 1280)   0           ['Conv_1_bn[0][0]']              
                                                                                                  
 flatten (Flatten)              (None, 20480)        0           ['out_relu[0][0]']               
                                                                                                  
 dense (Dense)                  (None, 128)          2621568     ['flatten[0][0]']                
                                                                                                  
 dense_1 (Dense)                (None, 1)            129         ['dense[0][0]']                  
                                                                                                  
==================================================================================================
Total params: 4,879,681
Trainable params: 2,621,697
Non-trainable params: 2,257,984
__________________________________________________________________________________________________

# 만든 헤드 모델을 베이스 모델과 붙여 model로 만들어주고 서머리를 찍어보면

만들었던 Flatten, 히든레이어, 아웃풋 레이어가 들어가 있고

학습 가능한 데이터가 생겼다

 

 

 

 

from keras.optimizers import RMSprop

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

# 모델을 컴파일 해준다

 

 

 

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1/255.0, width_shift_range=0.2)
test_datagen = ImageDataGenerator(rescale= 1/255.0)

train_generator = train_datagen.flow_from_directory(train_dir, target_size=(128, 128), class_mode='binary', batch_size= 128)
>>> Found 2000 images belonging to 2 classes.

test_generator = test_datagen.flow_from_directory(test_dir, target_size=(128, 128), class_mode='binary', batch_size= 128)
>>> Found 1000 images belonging to 2 classes.

# 준비한 이미지 데이터를 넘파이로 바꿔주는 작업을 한다.

실제 실무에서는 데이터의 증강까지 해주어야 한다

 

 

 

model.fit(train_generator, epochs= 5, validation_data=(test_generator) )
>>>
Epoch 1/5
16/16 [==============================] - 26s 995ms/step - loss: 0.4969 - accuracy: 0.8550 - val_loss: 0.1051 - val_accuracy: 0.9630
Epoch 2/5
16/16 [==============================] - 15s 997ms/step - loss: 0.1441 - accuracy: 0.9445 - val_loss: 0.0901 - val_accuracy: 0.9620
Epoch 3/5
16/16 [==============================] - 16s 985ms/step - loss: 0.1114 - accuracy: 0.9575 - val_loss: 0.1021 - val_accuracy: 0.9640
Epoch 4/5
16/16 [==============================] - 15s 938ms/step - loss: 0.0931 - accuracy: 0.9630 - val_loss: 0.0926 - val_accuracy: 0.9640
Epoch 5/5
16/16 [==============================] - 15s 936ms/step - loss: 0.0897 - accuracy: 0.9670 - val_loss: 0.0842 - val_accuracy: 0.9690
<keras.callbacks.History at 0x7f6bde493280>

# 학습을 시킨다

 

 

 

 

model.evaluate(test_generator)
>>> 8/8 [==============================] - 3s 358ms/step - loss: 0.0842 - accuracy: 0.9690
[0.08420132100582123, 0.968999981880188]

# evaluate로 평가를 해보니 96프로의 확률이 나왔다

이처럼 트랜스퍼 러닝을 이용하면 정확도가 높은 인공지능을 쉽게 얻을 수 있다

'Python > Deep Learning' 카테고리의 다른 글

Modelcheckpoint / CSVLogger 사용법  (0) 2023.01.02
Fine Tuning  (0) 2023.01.02
이미지 파일을 numpy로 변환 후 학습  (0) 2022.12.30
파이썬으로 파일 다운로드 및 압축파일 푸는 방법  (0) 2022.12.30
Pooling  (0) 2022.12.30