모델 요약 함수: torchinfo 라이브러리

information = torchinfo.summary(
		model,
		input_data
)

확인하고자 하는 모델과 입력 데이터를 전달했을 때 각 계층의 출력 형태와 매개변수의 수를 확인할 수 있다. 모델에 입력하는 텐서 데이터의 형태에 따라 출력 형태가 바뀐다.

#모델 불러오기 함수
from torchvision import models
from torchinfo import summary

model = models.alexnet(weights="AlexNet_Weights.IMAGENET1K_V1")
summary(model, (1, 3, 224, 224), device="cpu")

알렉스넷 모델 불러오기 함수는 사전 학습된 가중치(weight) 매개변수로 대규모 데이터세트에서 학습된 알렉스넷을 불러올 수 있다.

AlexNet_Weights.IMAGENET1K_V1

속성
acc@1 56.522
acc@5 79.066
입력 이미지 최소 크기 63X63
매개변수의 수 61,100,840
카테고리(클래스) 수 1,000
GFLOPS 0.71
파일 크기 233.1MB

acc@n: 상위 n개 레이블에 대한 예측 정확도

GFLOPS: 초당 기가 부동 소수점 연산(Giga-Floating Point Operations Per Second), 해당 모델에 대한 컴퓨팅 성능을 측정한 값. 모델이 1초 동안 수행할 수 있는 부동 소수점 산술 연산의 수를 표현하는 방법이다. 값이 높을수록 복잡한 계산 및 데이터 처리 작업을 더 빠르게 수행할 수 있다.

Untitled

출력 결과는 알렉스넷에 (1, 3, 224, 224) 크기의 텐서를 입력했을 때 계층마다 출력하는 특징 맵의 크기와 필요한 매개변수의 수를 보여준다.

Layer, Output Shape, Param은 각 계층의 종류 및 구조, 출력 텐서의 크기, 계층에서 사용된 매개변수의 수를 의미한다.

알렉스넷에 사용된 계층 클래스 목록

계층 설명
시퀀셜(Sequential) 계층 인스턴스를 묶음
합성곱(Conv2d) 3차원 텐서를 입력받아 합성곱 연산을 수행
ReLU ReLU 활성화 수행
최댓값 풀링(MaxPool2d) 3차원 텐서를 입력받아 최댓값 풀링 수행
적응형 평균값 풀링(AdaptiveAvgPool2d) 입력 텐서의 형태에 상관없이 일정한 형태로 풀링 수행
드롭아웃(Dropout) 일정한 비율로 드롭아웃 수행
선형 변환(Linear) 2차원 텐서를 입력받는 완전 연결 계층
#클래스 정보 파일 불러오기
with open("../datasets/imagenet_classes.txt", "r") as file:
    classes = file.read().splitlines()
    
print(f"클래스 개수 : {len(classes)}")
print(f"첫 번째 클래스 레이블 : {classes[0]}")

Untitled

입력 이미지: 256X256 크기를 사용하며, RGB 픽셀값의 평균과 분산을 활용해 정규화를 적용한다.

#이미지 데이터 전처리
import torch
from PIL import Image
from torchvision import models, transforms

# torchvision.transforms 모듈을 사용하여 이미지 전처리를 위한 변환 과정
transform = transforms.Compose(
    [
        # 이미지 크기를 (224, 224)로 조정합니다.
        transforms.Resize((224, 224)),
        # 이미지를 PyTorch Tensor로 변환합니다.
        transforms.ToTensor(),
        # 이미지를 정규화합니다. 평균(mean)과 표준편차(std)를 사용하여 RGB 채널별로 정규화합니다.
        transforms.Normalize(
            mean=[0.485, 0.456, 0.406],  # RGB 각 채널의 평균값
            std=[0.229, 0.224, 0.225]      # RGB 각 채널의 표준편차
        ),
    ]
)

device = "cuda" if torch.cuda.is_available() else "cpu"
model = models.alexnet(weights="AlexNet_Weights.IMAGENET1K_V1").eval().to(device)

tensors = []
files = ["../datasets/images/airplane.jpg", "../datasets/images/bus.jpg"]
for file in files:
    image = Image.open(file)
    tensors.append(transform(image))

tensors = torch.stack(tensors)
print(f"입력 텐서의 크기 : {tensors.shape}")

Untitled

전처리 과정 중 정규화 클래스(Normalize)의 평균과 표준편차를 각각 [0.485, 0.456, 0.406]과 [0.229, 0.224, 0.225]로 사용한다.