에일리언 vs 프레데터 데이터셋
- 케글 api 사용하기
- 케글 로그인 -> 우측 상단 계정 클릭 -> Your Profile 클릭 -> Setting -> Account -> API에서 Create New API Token -> Kaggle.json 파일이 다운로드 됨
# 모듈 import
import os
# 케글 연결하기
os.environ["KAGGLE_USERNAME"] = "name"
os.environ["KAGGLE_KEY"] = "apikey"
# 데이터셋 가져오기
!kaggle datasets download -d pmigdal/alien-vs-predator-images
# zip파일 풀기
!unzip -q /content/alien-vs-predator-images.zip
# 필요한 모듈 import
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from torchvision import datasets, models, transforms
from torch.utils.data import DataLoader
# device 확인
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)

이미지 증강 기법(Image Augmentation)
- 원본 이미지(데이터)를 조작하여 원본과는 크고 작은 변화를 가진 이미지를 생성하여 학습하는 기법이다.
- 일반적으로 모델 성능이 좋아진다.
- 오버피팅을 방지하는 목적이다.
- https://pytorch.org/vision/master/transforms.html
Transforming and augmenting images — Torchvision main documentation
Shortcuts
pytorch.org
data_transforms = {
"train": transforms.Compose([
transforms.Resize((224, 224)),
# 랜덤하게 각도, 찌그러뜨림, 크기 변형
transforms.RandomAffine(0, shear=10, scale=(0.8, 1.2)),
# 수평으로 뒤집기
transforms.RandomHorizontalFlip(),
transforms.ToTensor()
]),
"validation": transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
}
def target_transforms(target):
return torch.FloatTensor([target])
image_datasets = {
"train": datasets.ImageFolder("data/train", data_transforms["train"], target_transform=target_transforms),
"validation": datasets.ImageFolder("data/validation", data_transforms["validation"], target_transform=target_transforms)
}
dataloaders ={
"train": DataLoader(
image_datasets["train"],
batch_size=32,
shuffle=True
),
"validation": DataLoader(
image_datasets["validation"],
batch_size=32,
shuffle=False
)
}
imgs, labels = next(iter(dataloaders["train"]))
fig, axes = plt.subplots(4, 8, figsize=(16, 8))
for ax, img, label in zip(axes.flatten(), imgs, labels):
ax.imshow(img.permute(1, 2, 0)) # (3, 224, 224) -> (224, 224, 3) matplotlib 에서는 앞에 두개가 사이즈
ax.set_title(label.item())
ax.axis("off")

전이 학습(Transfer Learning)
- 하나의 작업을 위해 훈련된 모델을 유사 작업 수행 모델의 시작점으로 활용할 수 있는 딥러닝 접근법이다
- 신경망은 처음부터 새로 학습하는 것보다 전이 학습을 통해 업데이트하고 재학습하는 편이 더 빠르고 간편하다
- 전이 학습은 여러 응용 분야(검출, 영상 인식, 음성 인식, 자연어 분야, 검색 분야)에서 많이 사용된다.
- 전이 학습의 고려할 점
- 크기: 모델의 크기는 배포할 위치와 방법, 규모에 따라 달라진다.
- 속도 및 정확도: 하드웨어, 배치 크기, 모델과 같은 요소를 고려해야 한다.
- 사전 학습된 ResNet50 모델 사용하기
- 파이토치에서 제공하는 사전 학습 모델들: https://pytorch.org/vision/stable/models.html
Models and pre-trained weights — Torchvision 0.18 documentation
Shortcuts
pytorch.org
- ResNet50의 특징
- 네트워크가 이전 레이어의 출력을 다음 레이어로 직접 전달하는 "스킵 연결"을 통해 학습을 진행하는 방식이다.
- 기울기 소실 문제를 해결하고 훨씬 더 깊은 네트워크를 효과적으로 학습시킬 수 있다.
- 50개의 레이어로 구성되어 있으며 주로 Conv(컨볼루션) 레이어와 Batch Normalization, ReLU 활성화 함수, 풀링 레이어 등으로 이루어져 있다.
- 이미지 분류, 객체 탐지 등 다양한 컴퓨터 비전 작업에서 높은 성능을 보인다.
이미지넷(ImageNet)
- 이미지 데이터베이스
- 1000개의 클래스로 동물과 사물 이미지를 포함한다.
model = models.resnet50(weights="IMAGENET1K_V1").to(device)
print(model)

Freeze Layers
- 특징을 뽑아내는 CNN의 앞쪽 컨볼루션 레이어들은 수정하지 않도록 설정한다.
- 출력 부분의 레이어(FC)를 다시 설정하여 분류에 맞게 변경한다.
for param in model.parameters():
param.requires_grad = False # 가져온 파라미터를 업데이트 하지 않음
model.fc = nn.Sequential(
nn.Linear(2048, 128),
nn.ReLU(),
nn.Linear(128, 1),
nn.Sigmoid()
).to(device)
print(model)

# 학습
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)
epochs = 10
for epoch in range(epochs):
for phase in ['train', 'validation']:
if phase == 'train':
model.train()
else:
model.eval()
sum_losses = 0
sum_accs = 0
for x_batch, y_batch in dataloaders[phase]:
x_batch = x_batch.to(device)
y_batch = y_batch.to(device)
y_pred = model(x_batch)
loss = nn.BCELoss()(y_pred, y_batch)
if phase == 'train':
optimizer.zero_grad()
loss.backward()
optimizer.step()
sum_losses = sum_losses + loss
y_bool = (y_pred >= 0.5).float()
acc = (y_batch == y_bool).float().sum() / len(y_batch) * 100
sum_accs = sum_accs + acc
avg_loss = sum_losses / len(dataloaders[phase])
avg_acc = sum_accs / len(dataloaders[phase])
print(f'{phase:10s}: Epoch {epoch+1:4d}/{epochs} Loss: {avg_loss:.4f} Accuracy: {avg_acc:.2f}%')

# 이미지 확인하기
from PIL import Image
img1 = Image.open("/content/data/validation/alien/21.jpg")
img2 = Image.open("/content/data/validation/predator/30.jpg")
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(img1)
axes[0].axis("off")
axes[1].imshow(img2)
axes[1].axis("off")
plt.show()

img1_input = data_transforms["validation"](img1)
img2_input = data_transforms["validation"](img2)
print(img1_input.shape)
print(img2_input.shape)

test_batch = torch.stack([img1_input, img2_input])
test_batch = test_batch.to(device)
test_batch.shape

y_pred = model(test_batch)
y_pred

fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].set_title(f"{(1-y_pred[0, 0])*100:.2f}% Alien, {(y_pred[0, 0])*100:.2f}% Prediator")
axes[0].imshow(img1)
axes[0].axis("off")
axes[1].set_title(f"{(1-y_pred[1, 0])*100:.2f}% Alien, {(y_pred[1, 0])*100:.2f}% Prediator")
axes[1].imshow(img2)
axes[1].axis("off")

'Python > 머신러닝, 딥러닝' 카테고리의 다른 글
Python 딥러닝 포켓몬 분류 (2) | 2024.06.24 |
---|---|
Python 딥러닝 간단한 CNN 모델 만들기 (0) | 2024.06.24 |
Python 딥러닝 CNN(Convolutional Neural Networks) (0) | 2024.06.24 |
Python 딥러닝 비선형 활성화 함수 (0) | 2024.06.24 |
Python 딥러닝 (0) | 2024.06.24 |