열심히 코딩할래/AI 해볼까

[CNN] cnn 기본 예제, 코드분석, convolution이란? input/output 차원 변화

오늘의 여름 2023. 7. 1. 12:41
728x90

 

 

 

 

 

📌CNN 아키텍처와 동작방식

 

 

▶convolution layer 합성곱층

: input 이미지에 합성곱 연산으로 feature map 생성한다.

▶Activate funtion 활성화 함수

: 일반적으로 ReLu 사용, 비선형을 추가해 모델의 표현력 향상시킨다.

 

▶convolution layer

: feature map의 크기를 줄이고 정보 유지. max pooling/average pooling

 

 

 

📌CNN 코드 예제 및 해석

# CNN 아키텍처 구성을 위한 클래스 정의
class CNN(nn.Module):
    def __init__(self, num_classes):
        super(CNN, self).__init__()

        # Convolutional Layer
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)
        # Activate funtion
        self.relu = nn.ReLU()
        # pooling layer - maxpooling
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        
        # Fully Connected Layer
        self.fc1 = nn.Linear(in_features=16 * 14 * 14, out_features=64)
        self.fc2 = nn.Linear(in_features=64, out_features=num_classes)

    def forward(self, x):
        # Convolutional Layer
        print(f"start conv: {x.shape}")
        x = self.conv1(x)
        print(f"after conv: {x.shape}")
        x = self.relu(x)
        print(f"after relu: {x.shape}")
        x = self.maxpool(x)
        print(f"after maxpooling: {x.shape}")
        
        # Flatten
        x = x.view(x.size(0), -1)
        
        # Fully Connected Layer
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        
        return x

class 전체적으로 해석하자면 def __init__에서는 layer를 정의해준다. 

conv 합성곱으로 feature map 지정해준다

ReLu 함수 -> maxpooling 

 

# 입력 데이터 생성 (batch_size=1)
input_size = (1, 28, 28)  # MNIST 이미지의 채널, 높이, 너비
input_data = torch.randn((1,) + input_size)
print(input_data.shape)


# 모델 생성 및 MNIST 데이터셋에 맞게 입력 크기 설정
model = CNN(num_classes=10)


# 모델에 입력 데이터 전달하여 출력 확인
output = model(input_data)
print(output.shape)  # 출력 크기 확인

 

▶input/output 차원 분석

input = (1,1,28,28)
conv2 -> (1,16,28,28)
ReLu -> 유지
Maxpooling2d (1,1,14,14)
Faltten -> 3차원->2차원 (1, 16, 14, 14)의 출력을 (1, 16 x 14 x 14)인 (1, 3136)으로 변환
f1 -> 특성 수가 3136이고 출력 특성 수가 64인 Fully Connected 레이어-> (1, 64)
f2 -> 특성 수 64 ->(1,10)
728x90