군침이 싹 도는 코딩
Transfer Learning 본문
트랜스퍼 러닝이란 잘 만들어진 인공지능 모델을 가져와
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 |