PyTorch를 이용한 다중 레이블 분류
필요한 라이브러리
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
# 필요에 따라 다른 라이브러리 추가
데이터 준비
다중 레이블 분류 문제를 위한 데이터는 여러 개의 레이블을 가진 데이터 샘플로 구성됩니다. 예를 들어, 이미지 데이터 세트에서 각 이미지는 여러 개의 태그 (예: 고양이, 풍경, 야외)를 가질 수 있습니다. 데이터는 다음과 같은 형식으로 준비해야 합니다.
# 데이터 샘플
data = [
(x1, [y1, y2, ...]),
(x2, [y1, y3, ...]),
...
]
# x: 데이터 (이미지, 텍스트 등)
# y: 레이블 (리스트 형태)
모델 구현
다중 레이블 분류 모델은 일반적으로 다음과 같은 구조를 가집니다.
- 입력층: 데이터를 입력 받는 레이어
- 은닉층: 데이터를 처리하는 레이어 (여러 개의 은닉층을 사용할 수 있음)
- 출력층: 각 레이블에 대한 확률을 나타내는 레이어 (레이블 개수만큼 뉴런을 가짐)
다음은 파이토치를 이용하여 다중 레이블 분류 모델을 구현하는 코드 예시입니다.
class MultiLabelModel(nn.Module):
def __init__(self, input_dim, num_classes):
super().__init__()
# 입력층 -> 은닉층
self.hidden = nn.Linear(input_dim, 128)
# 은닉층 -> 출력층
self.output = nn.Linear(128, num_classes)
def forward(self, x):
# 은닉층 통과
x = self.hidden(x)
# 출력층 통과 (시그모이드 함수 적용)
x = torch.sigmoid(self.output(x))
return x
# 모델 생성
model = MultiLabelModel(input_dim, num_classes)
# 손실 함수 정의 (BCEWithLogitsLoss 사용)
criterion = nn.BCEWithLogitsLoss()
# 옵티마이저 정의 (Adam 사용)
optimizer = optim.Adam(model.parameters(), lr=0.001)
학습 및 평가
모델 학습 과정은 다음과 같습니다.
- 데이터 로더를 이용하여 데이터를 배치 단위로 불러옵니다.
- 모델에 데이터를 입력하고 출력을 계산합니다.
- 손실 함수를 이용하여 모델의 예측과 실제 레이블 간의 차이를 계산합니다.
- 옵티마이저를 이용하여 모델의 가중치를 업데이트합니다.
- 모델의 예측과 실제 레이블을 비교하여 정확도를 계산합니다.
# 데이터 로더 생성
train_loader = DataLoader(data, batch_size=32)
# 학습
for epoch in range(10):
for batch_idx, (data, target) in enumerate(train_loader):
# 모델 예측
output = model(data)
# 손실 계산
loss = criterion(output, target)
# 가중치 업데이트
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 평가
# ...
예제 코드
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 데이터 준비
train_data = datasets.MNIST(
root="./data",
train=True,
download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
)
test_data = datasets.MNIST(
root="./data",
train=False,
download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
)
# 데이터 로더 생성
train_loader = DataLoader(train_data, batch_size=32)
test_loader = DataLoader(test_data, batch_size=32)
# 모델 구현
class MultiLabelModel(nn.Module):
def __init__(self):
super().__init__()
# 입력층 -> 은닉층
self.hidden = nn.Linear(28 * 28, 128)
# 은닉층 -> 출력층
self.output = nn.Linear(128, 10)
def forward(self, x):
# 은닉층 통과
x = self.hidden(x)
# 출력층 통과 (시그모이드 함수 적용)
x = torch.sigmoid(self.output(x))
return x
# 모델 생성
model = MultiLabelModel()
# 손실 함수 정의 (BCEWithLogitsLoss 사용)
criterion = nn.BCEWithLogitsLoss()
# 옵티마이저 정의 (Adam 사용)
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 학습
for epoch in range(10):
for batch_idx, (data, target) in enumerate(train_loader):
# 모델 예측
output = model(data.view(-1, 28 * 28))
# 손실 계산
loss = criterion(output, target.float())
# 가중치 업데이트
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 평가
correct = 0
total = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data.view(-1, 28 * 28))
predicted = (output > 0.5).int()
total += target.size(0)
correct += (predicted == target).sum().item()
print(f"Accuracy: {100 * correct / total:.2f}%")
참고:
- 이 코드는 기본적인 예시이며, 다양한 방법으로 개선될 수 있습니다.
- 모델 구조, 손실 함수, 옵티마이저 등을 변경하여 모델 성능을 향상시킬 수 있습니다.
- 다양한 데이터 세트를 사용하여 모델을 학습하고 평가할 수 있습니다.
다중 레이블 분류를 위한 대체 방법
프레임워크
라이브러리
방법 선택
다음과 같은 요소들을 고려하여 다중 레이블 분류 문제에 적합한 방법을 선택해야 합니다.
- 데이터 크기 및 복잡성
- 모델 종류
- 개인 선호도 및 경험
- 사용 편의성
- 성능
pytorch