최근 인공지능 및 딥러닝 분야에서 자연어 처리(NLP)와 컴퓨터 비전(CV) 분야 모두에서 허깅페이스(Hugging Face) 라이브러리가 널리 사용되고 있습니다. 이 글에서는 허깅페이스 트랜스포머 라이브러리를 활용하여 이미지 데이터셋을 어떻게 처리하고 모델을 학습할 수 있는지에 대해 설명하고, 예제 코드를 통해 구체적으로 알아보겠습니다.
1. 허깅페이스와 트랜스포머란?
허깅페이스는 자연어 처리와 관련된 다양한 미리 훈련된 모델을 제공하는 라이브러리로, BERT, GPT-2, T5와 같은 모델을 손쉽게 사용할 수 있습니다. 하지만 최근에는 이미지 처리 모델인 비전 트랜스포머(ViT), CLIP 등이 추가되어 컴퓨터 비전 작업에서도 강력한 성능을 발휘하고 있습니다.
2. 필요한 패키지 및 환경 설정
허깅페이스의 트랜스포머 라이브러리를 사용하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 아래의 코드로 간단히 설치할 수 있습니다.
pip install transformers torchvision torch
3. 샘플 이미지 데이터셋
이번 강좌에서는 CIFAR-10 데이터셋을 샘플 데이터로 사용합니다. CIFAR-10은 10개의 클래스(비행기, 자동차, 새, 고양이, 사슴, 개, 펭귄, 기차, 곰, 자동차)로 구성된 6만 개의 32×32 색상 이미지를 포함하고 있습니다. 이 데이터셋은 이미지 분류 문제에 매우 적합합니다.
3.1 데이터셋 불러오기
파이썬의 torchvision 라이브러리를 활용하여 CIFAR-10 데이터셋을 불러오고, 학습과 검증 세트로 나누어 보겠습니다.
import torchvision
import torchvision.transforms as transforms
# 데이터 변환 설정
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
# 학습 및 검증 데이터셋 불러오기
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
3.2 데이터 전처리
불러온 데이터셋은 이미지 데이터를 텐서 형태로 변환하고 정규화 과정을 거쳐야 합니다. 위의 코드에서는 ToTensor() 메서드를 사용하여 이미지를 텐서로 변환하고, Normalize() 메서드를 사용하여 평균과 표준편차를 기반으로 정규화를 수행했습니다.
4. 비전 트랜스포머(ViT) 모델 구축
이제 ViT 모델을 구축하여 CIFAR-10 데이터셋에 대한 이미지를 분류하는 작업을 진행하겠습니다. 모델 정의는 허깅페이스의 transformers 라이브러리를 통해 간단하게 구현할 수 있습니다.
from transformers import ViTForImageClassification, ViTFeatureExtractor
# ViT 모델과 feature extractor 초기화
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224', num_labels=10)
위 코드는 비전 트랜스포머 모델을 초기화하는 과정으로, `num_labels` 매개변수는 클래스 수를 설정하는 데 사용됩니다. 여기서는 10개의 클래스를 가지고 있으므로 해당 값으로 설정하였습니다.
5. 모델 학습
모델을 학습하기 위해서는 손실 함수 및 최적화 알고리즘을 정의해야 합니다. 여기서는 CrossEntropyLoss 손실 함수를 사용하고, Adam 옵티마이저를 사용할 것입니다.
import torch.optim as optim
# 손실 함수 및 최적화 알고리즘 정의
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 모델을 학습할 장치 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
# 모델 학습
for epoch in range(10): # 10 에폭 동안 학습
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
# 기울기 초기화
optimizer.zero_grad()
# 순 forward + 역전파 + 최적화
outputs = model(inputs).logits
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999: # 매 2000 미니배치마다 출력
print(f"[{epoch + 1}, {i + 1}] loss: {running_loss / 2000:.3f}")
running_loss = 0.0
위 코드는 에폭 수와 미니배치에 따라 모델을 학습하는 과정입니다. 각 배치에 대한 손실을 계산하고, 역전파를 통해 가중치를 업데이트하는 방식으로 진행합니다.
6. 모델 평가
학습이 완료된 모델을 평가하기 위해 테스트 데이터셋을 사용하겠습니다. 모델의 정확도를 평가하는 방법은 다음과 같습니다.
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
images, labels = images.to(device), labels.to(device)
outputs = model(images).logits
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')
위 코드는 테스트 데이터셋에서 모델의 정확도를 계산하는 과정입니다. 각 이미지에 대해 예측값과 실제 라벨을 비교하여 정확도를 산출합니다.
7. 결론
이번 글에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 CIFAR-10 데이터를 처리하고, 비전 트랜스포머 모델을 구축하여 이미지를 분류하는 방법을 알아보았습니다. 허깅페이스의 라이브러리를 사용하면 복잡한 모델을 손쉽게 구축하고, 다양한 데이터셋을 활용하여 성능을 최적화할 수 있습니다. 앞으로 더 다양한 모델과 데이터셋을 활용한 딥러닝 적용 사례를 계속 탐구해보시길 바랍니다.
문의 및 추가 정보가 필요하신 경우 댓글로 남겨주시면 감사하겠습니다.