본문 바로가기
Programming/Python

[CNN] Convolutional Neural Networks

출처: AI 엔지니어 기초 다지기 : 네이버 부스트캠프 AI Tech 준비과정

 

 

 

Convolution의 수학적 정의: f와 g 두 개의 함수를 잘 섞어주는 operator

I: 전체 이미지 공간 // K: 적용하려는 convolution filter

 

 

 

 

가장 기본적인 convolution 예제: 3x3 filter를 7x7 image에 convolution하면 5x5 output이 나온다.

K: convolution filter

곱셈방식은 직관적인 스칼라 곱셈 형태이다.

 

이런식으로 하나하나 output이 계산되면 5x5 output으로 convolution operation이 수행된다.

 

 

이런 방식을 통해 실제 2d convolution이 진행된 예제는 다음과 같다.

 

일반적으로 다루는 RGB Image Convolution을 사용한다.

tensor: RGB image를 수학적으로 표현하는 것

보통 임의의 image를 convolution한다는 의미에는 filter와 image의 depth(예제에서는 3이 해당됨) 크기가 같음을 전제함

 

 

 

 

다른 RGB convolution 예제

Image와 filter 크기를 알면 output의 크기를 알 수 있다. (규칙적임)

 

 

 

 

이러한 convolutions(CONV)들은 stack이 될 수 있다.

한 번 CONV할 때, 각 filters의 적절한 개수와 size 그리고 non-linear activation function 적용 

 

 

 

 

 

사실 이게 CNN의 전부임

 

Convolutional Neural Networks(CNN):  convolution layer, pooling layer, fully connected layer 3개 구성됨

가장 일반적이고 고전적인 CNN

Convolution, pooling layers: feature extraction  이미지 유용한 정보 추출

Fully connected layer: decision making(ex> classification, regression)   <- 점점 최소화하거나 없어지는 추세임

왜?: 이 layer는 파라미터 개수에 dependent

파라미터 개수 많으면 -> 학습이 어려움 -> generalization performance 저하(학습잘해도 실질 deploy 성능 별로임)

-> 요즘 CNN 발전 방향: convolution layers은 깊고 많아지지만 파라미터 숫자는 가능한 줄이고자 함

 

모델 살피기: neural network(layer)별로 몇 개의 파라미터로 구성되고, 전체 파라미터 개수가 몇 개인지 중점을 두며 본다. 

 

 

point: 모델을 보고 파라미터 개수에 단위가 어느 정도일지 감각이 있어야함!

GoogLeNet: Convolution Arithmetic

 

 

 

Kernel:  convolution filter

Stride:  convolution filter(Kernel)를 얼마나 자주 찍을 지에 대한 것. 

stride 1차원 예제: stride 값이 커지면 sparse, 작아지면 dense

 

 

padding:  Boundary 정보로 인해 convolution operation이 완전하지 못할 때 가장자리에 덧대주는 역할

Stride (2)인 경우, 찍는 stamp행위가 한칸씩이 아닌 두칸씩 건너서 이뤄진다. 3번째 그림은 2번만에, 4번째 그림은 3번만에 가로길이를 도달한다.

 

 

 

 

 

예제문제 1: What is the number of parameters of this model?

C: channel(채널)

 

정답 원리: 커널 크기 * 기존 C 크기 * 변환된 output C 크기

 

padding, stride는 파라미터 숫자 계산과 무관!

point: 모델을 보고 파라미터 개수에 단위가 어느 정도일지 감각이 있어야함!

 

 

 

 

 

예제문제 2: What is the number of parameters of this model?

이 그림의 모형은 AlexNet(2012)이다.

빨간 숫자: convolution layers

35k = 11 * 11(kernel 크기)  * 3 (input depth, or channel) * 48 (output depth) * 2 (이러한 구조를 2개 만들기 때문)

307k = 5 * 5 (kernel 크기) * 48 (input depth, or channel) * 128 (output depth) * 2 (이러한 구조를 2개 만들기 때문)

884k = 3 * 3    * 128   *  2 (두개의 interchange) * 192 * 2

이런식으로 계산되는데...

 

파란 숫자: dense layers (크기가 매우 커짐),  fully connected layer에 해당됨 (차원값 = input 개수 * output 개수)

177M = 13 * 13(채널 값) * 128(채널 숫자) * 2(2개 있음) * 2048(출력값)  * 2(2개 있음)

확실히 숫자가 큼 <- why? )  convolution operator가 각각의 하나의 커널 모든 위치에 동일하게 적용되기 때문

즉, convolution operator가 모두에게 shared parameter가 되었기 때문

 

 

파라미터 숫자가 많으면 안좋음 -> 줄이는게 트랜드 -> 이 dense layer에 대한 대응책은? ->

 

 

1x1 Convolution  ( 굉장히 자주사용되는 필수 테크닉! )

1 x 1 Convolution

Reduce the number of parameters and its dimension while increasing the depth

ex) bottleneck architecture

 

 

* convolution의 Output size 구하는 수식: (width - filter) / Stride  + 1

 

 


2012~2018 CNN model 살펴보기

모델 살피기: neural network(layer)별로 몇 개의 파라미터로 구성되고, 전체 파라미터 개수가 몇 개인지 중점 둔다!

결과적으로 Dense는 깊어지고 파라미터 개수가 줄어드는 테크닉에 집중!

 

 

ILSVRC: ImageNet Larget-Scale Visual Recognition Challenge 이미지 분류 챌린지

Classification, Detection, Localization, Segmentation을 다룸, 1000개의 다른 카테고리, 100M 이상의 이미지

Training set: 456567개의 이미지

 

 

 

cf) human 계산?: Tesla 사람이 샘플로 스스로 동료직원과 테스트해서 평균 error가 5.1%가 나왔다고 함.

2015년은 human보다 성능이 잘 나온 기념비적인 해

 

 

 

 

 

AlexNet의 구조

Key Idea: ReLU(Rectified Linear Unit) non linear 활성함수 사용, 2개의 GPU 사용(GPI implementations), Overlapping pooling, Local response normalization(요즘 잘 안씀), Data augmentation, Dropout 기법 적용

 

지금 보면 당연한 기법들처럼 보이지만 2012년 당시에는 당연하지 않았던 기법들이다.

 

Vanishing gradient problem(gradient slope가 0에 가까워지는 문제) 극복이 핵심!

 

 

 

 

 

 

 

 

 

 

Key idea: 3x3 convolution filters with stride 1 사용했다는 점!

 

파라미터 개수가 작은거 2개쓰는게 큰거 1개쓰는것 보다 적어짐

이를 기점으로 많아야 5x5, 7x7이지 옛날처럼 11x11은 거의 없어짐

 

 

 

 

그외 기법: 1x1 convolution for fully connected layers(이걸로 파라미터 줄이려한 건 아님), Dropout(p=0.5), VGG16(레이어 16개), VGG19(레이어 19개)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3x3 filter도 포함하면서 1x1 conv로 파라미터를 더 줄이고 싶은 시도이다.

22 Layers

NiN(Network-In-Network): 비슷한 network구조 안에 network가 있다. 비슷한 network구조가 반복되고있다.

 

Inception blocks: input을 여러개로 나눠졌다가 다시 합치는 것. 이 과정에 1x1 Conv(파라미터 개수 줄어듦)가 point!
-> 1x1Conv로 인해 channel-wise dimenstion reduction 可

 

기존 것(왼쪽): 3x3 filter 사용

새로운 것(오른쪽): 3x3 filer 사용 전에 1x1 conv로 채널방향 dimention reduction 수행 후 3x3 적용 

-> 기존 147456에서 파라미터 개수가 40960로 줄어듦. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

파라미터가 많아지면서 학습이 어려운 overfitting 문제해결 추구 -> an Identity map(skip connection) 추가하는 방법

f(x)가 학습하는 것은 x(residual)만 학습하도록 유도함

 

이에 따라 기존(왼쪽)과 달리 ResNet으로 깊은 layer에 학습이 더 잘 가능해짐.

 

an identity map after nonlinear activations

Simple Shortcut: 보통 많이 사용하는 형태

Projectecd Shortcut: 차원이 안맞을 때 1x1 Conv로 맞춰주는 경우

 

특이점: Batch Normalization 과정이 Convolution 다음에 이뤄진다는 것. (원본 논문)
그러나 ReLu뒤에 Batch Norm넣어야된다는 주장도 있어서 순서는 약간 interchngable한듯

 

 

Bottleneck architecture

3x3 conv 하기 전, 1x1 conv로 input채널 줄이고, 다시 나올 때 1x1 conv로 늘리는 작업 (앞의 inception structure와 같음)

 

파라미터 size가 줄어드니 성능이 향상된다. (모형별 비교)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Key Idea: ResNet은 더해주지만 이 대신해 Concatenate를 하자.

문제점: concatenate하면 기하급수적으로 채널(파라미터) 커짐 -> Transition Block 사용 필요

-> Dense Block(늘리기; concatenate) 와 Transition block(늘린 것을 1x1 conv로 다시 줄이기)를 같이 사용한다.

 

 

 

ResNet이나 DenseNet 구조 둘 중 하나 선택하면 왠만큼 성능이 잘 나온다.

 

728x90
반응형