-
pytorch-7 전이학습과 파인튜닝딥러닝/pytorch 2023. 7. 11. 20:18
1. backbone network
백본은 detection, segmentation 등의 인공지능 모델에서 입력데이터로부터 특징 추출을 수행하는 부분이다. 백본은 모델의 사전학습된 가중치를 가지며 백본 네트워크의 성능에 따라 학습속도와 정확도에 영향을 미친다.
2. transfer learning
전이 학습은 미리 학습된 모델을 사용하여 새로운 작업에 사용하는 것을 의미한다. 하나의 모델의 데이터를 구하고 학습을 진행하는데 많은 자원과 환경낭비를 초래할 수 있다. 따라서 많은 사람들이 인공지능 모델의 공개에 찬성하고 있으며 전이학습은 미리 학습된 모델들을 백본으로 사용하여 작업의 목적에 맞게 변경하여 사용하는 것이다.
import torch import torch.nn as nn import torch.optim as optim import torchvision.models as models import torchvision.transforms as transforms import torchvision from torch.utils.data import DataLoader device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = models.resnet50(pretrained=True)
전이학습을 위해 cpu를 배정하고 resnet50을 가져온다.
for param in model.parameters() : param.requires_grad = False num_classes = 10 model.fc = nn.Linear(in_features=model.fc.in_features, out_features=num_classes)
requires_grad를 False로 설정하면 grad를 진행하지 않아 가중치를 더 이상 업데이트하지 않겠다는 의미이다. 마지막 층인 fc레이어를 새로운 fc레이어로 설정하며 출력 파라미터 수를 10개로 교체한다.
transform = transforms.Compose([ transforms.Resize((224,224)), transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.2,0.2,0.2)) ]) train_dataset = torchvision.datasets.CIFAR10(root="./data", train=True, download=False, transform=transform) test_dataset = torchvision.datasets.CIFAR10(root="./data", train=False, download=False, transform=transform) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
transform을 설정하고 cifar10 데이터를 로드하여 잘라준다.
criterion = nn.CrossEntropyLoss() optimizer = optim.AdamW(model.fc.parameters(), lr=0.001) model = model.to(device)
옵티마이저와 손실함수를 설정하고 모델을 구성한다.
num_epochs = 5 for epoch in range(num_epochs) : train_loss = 0.0 model.train() for images, labels in train_loader : images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() train_loss += loss.item() * images.size(0) train_loss /= len(train_loader.dataset) print(f"Epoch {epoch+1}/{num_epochs}, train_loss {train_loss}")
5번 학습을 반복하고 손실함수를 확인한다.
model.eval() correct = 0 total = 0 with torch.no_grad() : for images, labels in test_loader : images = images.to(device) labels = labels.to(device) outputs = model(images) _, pred = torch.max(outputs.data, 1) total += labels.size(0) correct += (pred == labels).sum().item() acc = 100 * correct / total print(f"Test acc : {acc:.2f}%")
모델의 정확도를 평가한다.
3. fine tuning
파인 튜닝은 전이학습의 일종으로 사전 학습된 모델을 나의 입맛에 맞게 변형하는 작업을 의미한다. 레이어를 목적에 따라 일부 추가하거나 조정하거나 데이터만 따로 준비하여 학습을 시키는 등 약간의 변형을 가지는 방법이다.
'딥러닝 > pytorch' 카테고리의 다른 글
pytorch-8 앙상블 (0) 2023.07.11 pytorch-6 과적합 방지 방법 (0) 2023.07.10 pytorch-5 CNN (0) 2023.07.09 pytorch-4 stride conv, dilated conv, 가중치 행렬 시각화 (0) 2023.07.09