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초 동안 수행할 수 있는 부동 소수점 산술 연산의 수를 표현하는 방법이다. 값이 높을수록 복잡한 계산 및 데이터 처리 작업을 더 빠르게 수행할 수 있다.

출력 결과는 알렉스넷에 (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]}")

입력 이미지: 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}")

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