Dog vs Cat 데이터셋
전처리
from torchvision import transforms
IMAGE_SIZE = 224
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.CenterCrop((IMAGE_SIZE, IMAGE_SIZE)),
transforms.ToTensor(),
transforms.Lambda(lambda x: (x / 127.5) - 1)
])
- 이미지 데이터는 0~255로 밝기를 표현
- 신경망에서 사용하는 시그모이드 등의 함수는 지나치게 큰 값이 들어오면 경사가 0에 가까워져서 학습이 잘 되지 않음
- -1~+1 범위로 재조정
데이터 로딩
from torchvision.datasets import ImageFolder
train_dataset = ImageFolder(root='cats_and_dogs_filtered/train', transform=transform)
val_dataset = ImageFolder(root='cats_and_dogs_filtered/validation', transform=transform)
from torch.utils.data import DataLoader
BATCH_SIZE = 32
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)
모델 정의
model = keras.Sequential([
keras.Input(shape=(3, IMAGE_SIZE, IMAGE_SIZE)),
keras.layers.Conv2D(32, (3, 3), activation='relu', data_format='channels_first'),
keras.layers.MaxPooling2D((2, 2), data_format='channels_first'),
keras.layers.Flatten(),
keras.layers.Dense(512, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
- Keras는 기본적으로 Height, Width, Channels 순으로 입력
- PyTorch는 Channels가 먼저 나오므로 데이터 포맷을 그에 맞춰줌
훈련
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss='binary_crossentropy',
metrics=['accuracy']
)
model.fit(
train_loader,
epochs=1,
validation_data=val_loader
)
이미지 한 장 입력
from PIL import Image
image = Image.open('cats_and_dogs_filtered/validation/cats/cat.2000.jpg')
image
x = transform(image)
x.shape
batch = x.unsqueeze(0)
model.predict(batch)