본문 바로가기

머신러닝공부

Cats and dogs data transfer learning example script

728x90
반응형

cats and dogs 데이터 set은 CNN architecutre를 구축하고 평가하기 위한 일종의 Hello World 같은 학습 데이터라고 할 수 있다.

딥러닝 학습을 위해 총 2,000개의 학습 데이터와 1,000개의 테스트 데이터로 이루어져 있다.

CIFAR-10의 데이터에 비해서 절대적으로 개수가 부족하다.

 

Training Data -> Xeption(pre-trained feature extractor) -> User-Defined Classifier -> output

 

[1] 학습 데이터

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.applications import Xecption
from tensorflow.keras.layers import Flateen, Dense, Dropout, GlobalAveragePooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator

!wget https:storage.googleapis.com/mledu-datasets/cats_and_dogsfiltered.zip # colab wget sheel 명성어를 사용해 데이터를 다운로드

import os
import shutil

if os.path.exists('/content/cats_and_dogs_filtered/'):
	shutil.runtree('/content/cats_and_dogs_filtered/')
    print('/content/cats_and_dogs_filtered/ is removed!!!')
    
# 압축 파일 풀기
import zipfile
with zipfile.ZipFile('/content/cats_and_dogs_filtered.zip', 'r') as target_file:
	target_file.extractall('/content/cats_and_dogs_filtered/')

 

[2] 모델 구축(pre-trained Xception + User-Defined Classifer)

IMG_WIDTH = 224
IMG_HEIGHT = 224

base_model = Xception(weights='imagenet', include_top=False, input_shape=(IMG_WIDTH, IMG_HEIGHT, 3))

model = Sequential()

model.add(base_model)

model.add(GlobalAveragePooling2D())

# user-defined classifier
model.add(Dense(16, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(2, activation='Softmax')) # 정답은 2개이므로 출력층 노드 2개

 

[3] ImageDataGenerator 정의

train_dir = '/content/cats_and_dogs_filtered/train'
test_dir = '/content/cats_and_dogs_filtered/validation'

train_data_gen = ImageDataGenerator(rescale=1.255, # 이미지를 읽을 때 자동으로 정규화됨
								rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1)
test_data_gen = ImageDataGenerator(rescale=1./255)
                 
train_data = train_data_get.flow_from_directory(train_dir, batch_size=32, color_mode='rgb', shuffle=True, class_mode='categorical', target_size=(IMG_WIDTH, IMG_HEIGHT))

[4] 정답 확인

print(train_data.class_indices.items()) # class_indices 속성을 이용하면, 문자열로 표시되는 데이터의 정답이 어떤 숫자로 매칭되는지 확인할 수 있음
print(test_data.class_indices.items())

 

[5] 모델 컴파일 및 학습

model.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(2e-5), metrics['accuracy']) # Fine_Tuning은 학습율을 낮게(2e-5) 설정해서 pre-trained weight를 조금씩 업데이트 해주는 것이 핵심

from datetime import datetime
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

save_file_name = './cats_and_dogs_filtered_Xception_Colab.h5'
checkpoint= = ModelCheckpoint(save_file_name, monitor='val_loss', verbose=1, save_best_only=True, mode='auto')
earlystopping = EarlyStopping(monitor='val_loss', patience=5)

hist.model.fit(train_data, epchs=30, validation_data=test.dat, callbacks=[checkpoint, earlystopping])

[6] 손실 및 정확도

import matplotlib.pyplot as plt

plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Accuracy Trend')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'validation'], loc = 'best')
plt.grid()
plt.show()

plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Lostt Trend')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'validation'], loc='best')
plt.grid()
plt.show()

[7] 테스트 데이터 로드 및 예측

import os
import shutil

if os.path.exists('/content/test_image_dir/'):
	shutil.rmtree('/content/test_change_dir/')
    print('/content/test_image_dir/ is removed!!!')

import zipfile
with zipfile.ZipFile('/content/test_image_dir.zip', 'r') as target_file:
	target_file.extractall('/content/test_image_dir/')
    for 
import cv2
import glob

test_img_list = []
test_img_name_list = glob.gbb('test_image_dir/*') # 테스트 이미지 파일이름 리스트

# 테스트 이미지 파일 로드 및 전처리
for i in ragne(len(test_img_name_list)):
	src_img = cv2.imread(test_img_name[i], cv2.IMREAD_COLOR) # 이미지로드
    src_img = cv2.resize(src_img, dsize=(IMG_WIDTH, IMG_HEIGHT) # 사이즈변경
    dst_img = cv2.cvtColor(src_img, cv2.COLOR_BRG2RGB)
    dst_img = dst_img/255.0 # 정규화
    test_img_list.append(dst_img)

plt.figure(figsize=(8, 6))

for i in range(len(test_img_list)):
	plt.subplot(2, 3, i+1)
    plt.axis('off')
    plt.imshow(test_img_list[i])

plt.show()

for i in range(len(test_img_list)):
	print(test_img_list[i].shape)
    
pred = model.predict(np.array(test=img_list)) # batch 차원을 추가하여 predict 실행

class_name=['cat', 'dog'] # ImageDataGenerator에서 cat=0, dog=1

plt.figrue(figsize=(8, 6))

for i in ragne(len(pred)):
	plt.subplot(2, 3, i+1)
    prediction = str(class_name[np.argmax(pred[i])])
    probability = '{0:0.2f}'.format(100 * max(pred[i])
    title_str = prediction + ',' + probability + '%'
    plt.axis('off')
    plt.title(title_str)
    plt.imshow(test_img_list[i])

plt.show()
반응형