관리 메뉴

Bull

[DL] CNN (Convolutional Neural Network) | study books 본문

Artificial Intelligence/Deep Learning

[DL] CNN (Convolutional Neural Network) | study books

Bull_ 2024. 10. 4. 00:53

CNN


CNN은 주로 Computer Vision 분야에서 데이터 분석하기 위해 사용되는 인공 신경망의 한 종류이다.

  • 합성곱 연산을 사용
  • 합성곱 연산 피쳐를 파악하는데 사용
  • 자연어 처리에서도 이전 시점 상태를 기억하기에 유리하지만 병렬처리의 어려움은 있음

합성곱 계층


  • 입력 데이터와 필터를 합성곱해 출력 데이터를 생성하는 계층
  • 데이터 특징을 추출하므로 지역적 패턴 인식가능
  • 모델이 학습해야 할 매개변수 수가 감소해 과대적합 방지

필터

  • 커널, 윈도라도 불림
  • 일정 간격을 이동하면서 입력 데이터와 합성곱 연산을 수행하여 피처맵을 만듬.
  • 필터에 들어간 값들을 가중치라고 함.
  • 필터와 이미지를 간격만큼 이동하면서 원소별 곱하여 합한 것을 해당 칸에 할당함.

패딩

  • 커널 연산을 하기전에 이미지에 패딩을 추가하여 피쳐 맵이 작아지는 현상을 막아줌.
  • 보통 패딩값은 0으로 할당하는데 이를 zero padding 이라함.

스트라이드

  • 필터가 한 번에 움직이는 크기
  • 입력 데이터의 공간적인 정보를 유지하거나 감소
  • 공간적인 정보는 픽셀간의 상대적인 위치나 거리에 대한 정보를 의미
  • 스트라이드를 작게하면 공간적인 정보를 보존, 크게하면 정보를 감소
  • 매개변수 수 또한 감소시킬 수 있으므로 복잡도를 낮추고 과대적합 방지가능

채널

  • R, G, B의 경우 동일한 필터가 존재하며 필터는 해당 채널의 정보를 추출해 특징 맵을 생성.
  • 채널이 많아질수록 학습할 수 있는 특징의 다양성이 증가하여 모델의 표현력이 높아짐.
  • 출력 채널이 많으면 각 채널은 입력 데이터에서 서로 다른 특징을 학습할 수 있다.
  • 출력 채널이 많으면 매개변수가 많아져 학습 시간, 메모리 사용량 증가로 이어짐. 그래서 과대적합 위험.

딜레이션

  • 합성곱 연산을 수행할 때 입력 데이터에 더 넓은 범위의 영역을 고려할 수 있게 하는 기법
  • 필터와 입력 데이터 사이에 간격을 두는 방법
  • 즉 커널 사이즈가 3x3이면 각 원소별 곱이 아닌 띄엄띄엄 곱.
  • 더 넓은 영역을 고려해 깊고 복잡한 모델 구성 가능
  • 메모리 사용량 또한 줄일 수 있음
  • 입력 데이터 범위가 커지므로 연산량이 늘어날 수있음

Conv2d class


conv=torch.nn.Conv2d(
    in_channels,
    out_channels,
    kernel_size,
    stride=1,
    padding=0,
    dilation=1,
    groups=1,
    bias=True,
    padding_mode="zeros",
)
  • in_channels : 입력 데이터 크기
  • out_channels : 출력 데이터 크기
  • kernel_size : 커널 사이즈
  • stride : 스트라이드
  • padding : 패딩
  • dilation : 딜레이션
  • groups : 입력 채널과 출력 채널을 하나의 그룹으로 묶음, 2이상 값으로 하면 입력 채널 출력 채널을 더 작은 그룹으로 나눠 각각 연산
  • bias : 계층의 편향 값도 포함 여부
  • padding_mode : 패딩 값, reflect는 가장자리를 거울처럼 반영, replicate는 가장자리 값을 복사

계층 출력 크기
$$ L_{out}=[\frac{L_{in}+2 \times padding -dilation \times (kernel - size -1)-1}{stride} + 1] $$

활성화맵(Activation Map)


  • 합성곱 계층의 피쳐 맵에 활성화 함수를 적용해 얻어진 출력 값
  • 일반적으로 합성곱 신경망에서는 ReLU 함수
  • 비선형성을 추가하기 위해 적용함풀링

  • 피쳐 맵의 크기를 줄이는 연산
  • 입력 데이터의 정보를 압축하는 효과
  • 최댓값 풀링과 평균값 풀링 존재Pooling class

pool=torch.nn.MaxPool2d(
    kernel_size,
    stride=None,
    padding=0,
    dilation=1
)
pool=torch.nn.AvgPool2d(
    kernel_size,
    stride=None,
    padding=0,
    count_include_pad=True
)
  • count_include_pad : 패딩 영역의 값을 평균 계산에 포함할지 여부 참이면 제로 패딩의 값이 평균값 풀링 연산에 포함.

평균값 풀링 출력 크기
$$ L_{out}=[\frac{L_{in}+2 \times padding - kernel - size -1}{stride} + 1] $$

완전 연결 계층 (Fully Connected Layer, FC)


  • 각 입력 노드가 모든 출력 노드와 연결된 상태
  • 입력과 출력 간의 모든 가능한 관계 학습이 가능
  • 예를 들어 2차원을 1차원 벡터 형태로 변경할 수 있음
  • 최종적인 분류 작업을 수행
  • 최종값은 소프트맥스나 시그모이드 같은 활성화 함수를 적용
import torch
from torch import nn

class CNN(nn.Module):
    def __init__(self):
        super().__init__()

        self.conv1 = nn.Sequential(
            nn.Conv2d(
                in_channels=3, out_channels=16, kernel_size=3, stride=2, padding=1
            ),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )

        self.conv2 = nn.Sequential(
            nn.Conv2d(
                in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1
            ),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )

        self.fc = nn.Linear(32 * 32 * 32, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = torch.flatten(x)
        x = self.fc(x)
        return x
  • 입력 -> (합성곱 계층, ReLU, 최댓값 풀링) -> (합성곱 계층, ReLU, 최댓값 풀링) -> Flatten -> FC
  • 10개의 출력 벡터에 소프트맥스나 시그모이드를 적용하면 이미지를 입력할 때 클래스로 분류할 수 있음.

참고자료

https://product.kyobobook.co.kr/detail/S000209621433

 

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 윤대희 - 교보문고

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 트랜스포머는 딥러닝 분야에서 성능이 우수한 모델로 현대 인공지능 분야의 핵심 기술입니다. 트랜스포머와 비전 트랜스

product.kyobobook.co.kr