
캐글 PetImage 데이터셋을 활용하여 실습 진행
!pip install kaggle
Kaggle Account에 들어가서 Create New API Token을 통하여 Token 생성하기
from google.colab import files
uploaded = files.upload()
!chmod 600 /content/kaggle.json
해당 파일의 소유자에 대하여 읽기 쓰기 권환을 부여하는 코드!!
이후 kaggle에서 각자 필요로 하는 데이터셋을 찾고 API를 복사해와 서 사용하면 된다.
필자는 PetImage 데이터셋을 필요로 하기에 다음과 같이 진행하였다.
Cats-vs_Dogs
!kaggle datasets download -d shaunthesheep/microsoft-catsvsdogs-dataset
import os
import zipfile
zip_file_name = "microsoft-catsvsdogs-dataset.zip"
zip_file_path = f"/content/{zip_file_name}"
dataset_download_path = "/content/dataset"
# 다운로드한 압축 파일을 사용하여 데이터셋을 압축 해제
with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
zip_ref.extractall(dataset_download_path)
# 압축 파일 삭제
os.remove(zip_file_path)
!ls $dataset_download_path
data_dir = "/content/dataset/PetImages"
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import tensorflow as tf
path1 = '/content/dataset/PetImages/Cat/666.jpg'
path2 = '/content/dataset/PetImages/Dog/11702.jpg'
os.remove(path1)
os.remove(path2)
datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
train_generator = datagen.flow_from_directory(
data_dir,
target_size=(64, 64),
batch_size=32,
class_mode='binary',
subset='training'
)
validation_generator = datagen.flow_from_directory(
data_dir,
target_size=(64, 64),
batch_size=32,
class_mode='binary',
subset='validation'
)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_generator, epochs=10, validation_data=validation_generator)
# 테스트 데이터로 모델 평가
test_loss, test_acc = model.evaluate(validation_generator)
print(f'Test accuracy: {test_acc}')
* Train/val의 정확도 차이가 큰걸 보아 과적합이 이루어 졌음 확인
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(64, 64, 3))
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(train_generator, epochs=10, validation_data=validation_generator)
test_loss, test_acc = model.evaluate(validation_generator)
print(f'Test accuracy: {test_acc}')
Train/val 정확도 차이가 줄어들고 val의 정확도 증가
2-2에서 optimizer='SGD'로 변경 후 진행
학습 속도가 느렸던 부분을 해결하기 위해 SGD로 진행

결과

학습 속도는 생각했던 것처럼 눈에 띄게 향상되지 않았고 Val정확도에 큰 차이를 보이지 않는다.
Train / val 의 정확도 차이가 유의미하게 줄어는 것을 확인 할 수 있다.
작업 속도가 오래 걸려 많은 Epoch를 돌려보지 못하여 다음엔 추가로 돌려볼 예정이다.