[AI 인공지능 머신러닝 딥러닝/Python | PyTorch] - 인스톨! 파이토치 강의 소개
인스톨! 파이토치 강의 소개
혁펜하임 PyTorch 강의 오리엔테이션 요약혁펜하임 채널의 '[PyTorch] 0강. 오리엔테이션' 영상은 채널 5주년 기념으로 '인스톨! 파이토치' 강의를 소개하는 내용입니다. 강의자는 최근 출간한 '이론
inner-game.tistory.com

VGGNet은 옥스퍼드 대학의 Visual Geometry Group(VGG)이 개발한 CNN 아키텍처로, 2014년 ImageNet 대회에서 준우승을 차지한 모델입니다. 네트워크의 깊이가 성능에 어떤 영향을 미치는지 연구하기 위해 개발되었으며, 레이어를 깊게 쌓는 것에 초점을 맞춘 획기적인 모델입니다.[^1][^2][^3]
VGGNet의 가장 큰 특징은 3×3 크기의 작은 필터를 일관되게 사용한다는 점입니다. 이전 CNN 모델들이 큰 필터를 사용한 것과 달리, VGGNet은 작은 필터를 여러 층 쌓아 표현력을 높이면서도 파라미터 수를 줄였습니다.[^4][^5][^2]
VGG-16과 VGG-19가 가장 널리 사용되며, 숫자는 가중치를 가진 레이어의 개수를 의미합니다.[^5][^1]
전이 학습은 한 작업에 대해 훈련된 모델을 사용해 유사한 작업을 수행하는 모델의 기초로 활용하는 딥러닝 기법입니다. ImageNet과 같은 대규모 데이터셋으로 사전 학습된 모델의 지식을 새로운 작업이나 데이터셋에 활용합니다.[^6][^7][^8]
사전 학습된 모델의 가중치를 고정(freeze)하고, 마지막 분류층만 새로운 작업에 맞게 교체하여 학습합니다. 사전 학습된 모델을 특징 추출기로만 활용하는 방식입니다.[^10]
사전 학습된 모델의 일부 레이어를 고정하고, 나머지 레이어를 새로운 데이터로 재학습합니다. 모델 전체 또는 상위 레이어를 미세하게 조정하여 새로운 작업에 적응시킵니다.[^7][^10]
PyTorch는 torchvision.models를 통해 사전 학습된 VGGNet을 쉽게 불러올 수 있습니다:[^11][^12]
import torch
import torchvision.models as models
# 사전 학습된 VGG16 모델 로드
model = models.vgg16(pretrained=True)
# 또는 새로운 방식 (PyTorch 1.13+)
from torchvision.models import VGG16_Weights
model = models.vgg16(weights=VGG16_Weights.IMAGENET1K_V1)
pretrained=True 또는 weights 파라미터를 지정하면 ImageNet 데이터셋으로 사전 학습된 가중치를 자동으로 다운로드합니다.[^13]
VGG 모델은 특정 방식으로 전처리된 이미지로 학습되었으므로, 동일한 전처리를 적용해야 합니다:[^13]
from torchvision import transforms
# ImageNet 데이터셋의 평균과 표준편차 사용
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
from PIL import Image
import torch
# 이미지 로드 및 전처리
image = Image.open('cat.jpg')
input_tensor = transform(image)
input_batch = input_tensor.unsqueeze(0) # 배치 차원 추가
# 평가 모드 설정
model.eval()
# 예측 수행
with torch.no_grad():
output = model(input_batch)
# 가장 높은 확률의 클래스 찾기
probabilities = torch.nn.functional.softmax(output[^0], dim=0)
top5_prob, top5_catid = torch.topk(probabilities, 5)
# ImageNet 클래스 레이블 로드
with open('imagenet_classes.txt') as f:
categories = [line.strip() for line in f.readlines()]
# 결과 출력
for i in range(top5_prob.size(0)):
print(f"{categories[top5_catid[i]]}: {top5_prob[i].item():.4f}")
새로운 분류 작업에 맞게 모델을 수정하는 방법입니다:
import torch.nn as nn
# 원본 VGG16 로드
model = models.vgg16(pretrained=True)
# Feature extraction: 모든 레이어 고정
for param in model.parameters():
param.requires_grad = False
# 마지막 분류층만 교체 (예: 10개 클래스로 분류)
num_features = model.classifier[^6].in_features
model.classifier[^6] = nn.Linear(num_features, 10)
# 새로운 분류층만 학습됨
또는 일부 레이어만 fine-tuning:
# 처음 몇 개 레이어만 고정
for i, param in enumerate(model.features.parameters()):
if i < 10: # 처음 10개 레이어만 고정
param.requires_grad = False
# 나머지는 학습 가능
num_features = model.classifier[^6].in_features
model.classifier[^6] = nn.Linear(num_features, 10)
import torch.optim as optim
# 손실 함수와 옵티마이저 설정
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.classifier[^6].parameters(), lr=0.001, momentum=0.9)
# 훈련 루프
model.train()
for epoch in range(num_epochs):
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
VGGNet은 약 1억 3800만 개의 파라미터를 가지고 있어 메모리 사용량이 매우 큽니다. GPU 메모리가 부족한 경우 배치 크기를 줄여야 합니다.[^2]
레이어가 깊어 순전파와 역전파에 많은 시간이 소요됩니다. 실시간 애플리케이션에는 적합하지 않을 수 있습니다.
VGGNet은 224×224 크기의 입력을 요구하므로, 다른 크기의 이미지는 리사이즈가 필요합니다.[^4]
VGGNet과 전이 학습을 활용하면 적은 데이터와 계산 자원으로도 강력한 이미지 분류 모델을 만들 수 있습니다. PyTorch는 사전 학습된 모델을 쉽게 로드하고 활용할 수 있는 편리한 API를 제공하여, 실전 프로젝트에서 빠르게 적용할 수 있습니다. ImageNet으로 학습된 VGGNet의 일반적인 특징 추출 능력을 활용하여 새로운 도메인의 문제를 효율적으로 해결할 수 있습니다.
인스톨! 파이토치 10강 | PyTorch 고급 테크닉: 모델 내부 탐색과 Sequential vs ModuleList
[AI 인공지능 머신러닝 딥러닝/Python | PyTorch] - 인스톨! 파이토치 강의 소개 인스톨! 파이토치 강의 소개혁펜하임 PyTorch 강의 오리엔테이션 요약혁펜하임 채널의 '[PyTorch] 0강. 오리엔테이션' 영상
inner-game.tistory.com