[ML/DL] CNN 알고리즘

    CNN 알고리즘

    CNN은 Convolution과 Pooling을 반복적으로 사용하면서 불변하는 특징을 찾고, 그 특징을 입력데이터로 Fully-connected 신경망에 보내 Classification을 수행합니다.

    CNN 알고리즘 - Convolutional Neural Network (합성곱 신경망)

     

    이미지를 분석하기 위해 패턴을 찾는데 유용한 알고리즘으로, 이미지를 직접 학습하고 패턴을 사용해 이미지를 분류한다.
    CNN의 핵심적인 개념은 이미지의 공간정보를 유지하며 학습한다는 것이다.
    CNN은 필터링 기법을 인공신경망에 적용함으로써 이미지를 더욱 효과적으로 처리하기위해 제안되었으며 현재 딥 러닝에서 이용되고 있는 형태의 CNN이 제안되었다. 기존의 필터링 기법은 고정된 필터를 이용하여 이미지를 처리했다.

    CNN이 나오기 이전에는 FNN 신경망(Fully - connected multi layered Neural Network) 으로 학습하였는데, 이 기법의 문제점은 인접 픽셀간의 상관관계가 무시된다는 것이었다. FNN은 벡터 형태로 표현된 데이터를 입력 받기 때문에 이미지를 반드시 벡터화 해야 한다. 하지만 이미지 데이터는 일반적으로 인접한 픽셀간의 상관관계가 높기 때문에 이미지를 벡터화하는 과정에서 정보 손실이 발생한다.

    CNN은 이미지의 형태를 보존하도록 행렬 형태의 데이터를 입력 받기 때문에 이미지를 벡터화 하는 과정에서 발생하는 정보 손실을 방지할 수 있다. 즉, 행렬로 표현된 필터의 각 요소가 데이터 처리에 적합하도록 자동으로 학습되게 하자는 것이다.

    일반적인 신경망은 affine으로 명시된 fully - connected 연산과 ReLU와 같은 비선형 활성 함수의 합성으로 정의된 여러 계층을 쌓은 구조이다.
    CNN은 Feature를 추출하는 Convolution Layer와 추출된 Feature를 Sub-Sampling 하는 Pooling layer 로 구성되어 있다. Convolution Layer는 이미지에 필터링 기법을 적용하고, Pooling Layer 는 이미지의 국소적인 부분들을 하나의 대표적인 스칼라 값으로 변환함으로써 이미지 크기를 줄이는 등의 다양한 기능을 수행한다.

    - Convolution Layer

    Convolution Layer의 정의는 합성곱이다. 현재 위치의 출력 데이터는 인접한 Pixel에 Convolution Filter를 곱해서 얻어진 값이다.

    4X4 메트릭이 입력데이터이고 3X3 메트릭이 필터이다. (합성곱 수행 과정)

    합성곱을 거치면서 이미지의 크기는 점점 작아지게 되고 이미지의 가장자리에 위치한 픽셀들의 정보는 점점 사라지게 된다.
    이러한 문제점을 해결하기 위해 이용되는 것이 패딩(Padding)이다.
    패딩은 이미지의 가장자리에 특정값으로 설정된 픽셀들을 추가함으로써 입력이미지(4X4 매트릭)와 출력이미지(4X4 매트릭)의 크기를 같거나 비슷하게 만드는 역할을 수행한다.
    아래 그림은 0값을 갖는 픽셀을 추가하는 zero-padding을 적용한 예이며, CNN에서는 주로 zero-padding 이 이용된다.

    * 필터는 이미지의 특징을 찾아내기 위한 공용 파라미터입니다. Filter를 Kernel이라고 하기도 합니다.

    출력 데이터 산정

    • 입력 데이터 높이: H
    • 입력 데이터 폭: W
    • 필터 높이: FH
    • 필터 폭: FW
    • Strid 크기: S
    • 패딩 사이즈: P

    OutputHeight = OH = (H+2P−FH) /S + 1
    OutputWeight = OW = (W+2P−FW) /S + 1

     

    - Pooling Layer

    Pooling Layer는 sub sampling 이라고도 부른다.
    Pooling Layer는 컨볼루션 레이어의 출력 데이터를 받아서 출력데이터의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다.
    Pooling Layer를 처리하는 방법으로는 Max Pooling, Min Pooling, Average Pooling 이 있으며 일반적으로 Pooling 과 stride를 동일한 크기로 설정하여 모든 원소가 한번씩 처리되도록 한다. CNN에서는 주로 Max Pooling 을 사용한다.

    출력 데이터 산정

    OutputRowSize = InputRowSize/PoolingSize
    OutputColumnSize = InputColumnSize/PoolingSize

    Pooling Layer는 Convolution Layer와 비교하면 다음과 같은 특징이 있다.
    1) 학습대상 파라미터가 없음
        풀링은 대상 영역에서 최댓값이나 평균을 취하는 명확한 처리이므로 특별히 학습할 것이 없다. 
    2) Pooling Layer 를 통과하면 행렬의 크기 감소
        풀링은 세로. 가로 방향의 공간을 줄이는 연산이다. 
    3) Pooling Layer를 통해서 채널 수 변경이 없음
        채널마다 독립적으로 처리해주기 때문에 채널 수가 변하지 않는다. 
    4) 입력의 변화에 영향을 적게 받는다. 
        입력 데이터의 차이가 있다해도 풀링의 결과는 잘 변하지 않는다.  

    * Stride는 Filter의 이동 간격을 조절하는 파라미터 

     

     

    대표적인 CNN

     

     

    1. LeNet

     

    LeNet은  손글씨 숫자를 인식하는 네트워크이다. 

    아래 그림과 같이 합성곱 계층과 풀링 계층(서브샘플링 계층)을 반복하고, 마지막에 완전연결 계층을 거치면서 결과를 출력한다. 

    `현재의 CNN`과 비교했을때, `LeNet`은 활성화함수로 시그모이드함수를 사용하지만 `현재의 CNN`은 주로 ReLU를 사용한다. 

    또한 `LeNet`는 서브샘플링을 하여 중간 데이터의 크기를 줄이지만 `현재의 CNN`최대 풀링이 주류이다. 

    2. AlexNet

     

    AlexNet은 그 구성이 기본적으로 LeNet과 크게 다르지 않다. 

    AlexNet은 LeNet에서 큰 구조는 바뀌지 않았고,

     

    `활성화함수가 ReLU를 이용한다`,

    `Local Response Normalization이라는 국소적 정규화를 실시하는 계층을 이용한다`,

    `드롭아웃을 사용한다` 

     

    는 점에서 차이가 있다. 네트워크 구성 면에서는 큰 차이가 없다. 이를 둘러싼 환경과 컴퓨터 기술이 큰 진보를 이루어 대량의 데이터를 누구나 얻을 수 있게 되었고 병렬 계산에 특화된 GPU가 보급되면서 대량의 연산을 고속으로 수행할 수 있게 되었다. 

     

     

     


    출처
    https://sungwookkang.com/1408

     

    CNN (Convolutional Neural Network) 개념

    CNN (Convolutional Neural Network) 개념 CNN(Convolutional Neural Network)은 이미지를 분석하기 위해 패턴을 찾는데 유용한 알고리즘으로 데이터에서 이미지를 직접 학습하고 패턴을 사용해 이미지를 분류한다.

    sungwookkang.com

    http://taewan.kim/post/cnn/

     

    CNN, Convolutional Neural Network 요약

    Convolutional Neural Network, CNN을 정리합니다.

    taewan.kim

    https://gruuuuu.github.io/machine-learning/cnn-doc/

     

    호다닥 공부해보는 CNN(Convolutional Neural Networks)

    CNN? CNN은 이미지를 인식하기위해 패턴을 찾는데 특히 유용합니다. 데이터에서 직접 학습하고 패턴을 사용해 이미지를 분류합니다. 즉, 특징을 수동으로 추출할 필요가 없습니다. 이러한 장점때

    gruuuuu.github.io

     

    *이전 블로그 글을 정리하며 이전한 글입니다. (2022. 2. 2. 14:29 작성)

    댓글