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()
반응형
'머신러닝공부' 카테고리의 다른 글
Callback 함수 간단 정리 (0) | 2022.12.31 |
---|---|
Transfer Learning 전이학습을 활용한 나만의 이미지 분류 시스템 구현 예제 script (0) | 2022.12.31 |
전이학습 Transfer Learning 간단 정리 (0) | 2022.12.31 |
Functional API 사용시 혼동하는 경우 간단 정리 (0) | 2022.12.30 |
Functional API with CNN Example script (0) | 2022.12.30 |