일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Design DNN Accelerator
- Data HAzard
- pygraphviz 설치 오류
- gpgpu-sim
- CUDA
- makefile
- 데이터 해저드
- linux c 컴파일
- 클럭 게이팅
- Pyverilog 튜토리얼
- 이진수 곱셈 알고리즘
- linux c++ 컴파일
- CDC
- AMBA
- linux makefile 작성
- pytest-pythonpath 설치 오류
- gcc 컴파일
- DNN Accelerator
- 컨벌루션 연산
- Pyverilog 설치
- Pyvrilog tutorial
- Makefile compile
- Pyverilog 실행
- pyverilog 설치 오류
- 대구 반도체 설계기업 특화
- 딥러닝 가속기
- CLOCK GATING
- DNN 가속기
- 남산업힐
- systolic array
- Today
- Total
오늘은 맑음
Convolution연산과 수식 본문
CNN(Convolutinal Neural Network)에서 주를 이루는 Convolution layer에서 입력 데이터의 크기, 커널의 크기, 패딩, 보폭(stride)가 어떤 상관관계를 갖는지 수식을 통해 알아보자.
기본적인 Convolutoin의 과정은 위와 같다.
1. input feature map와 kernel(filter)가 있고 input feature map과 kernel이 각각 원소 곱 연산을 수행
2. 원소 곱의 결과들을 모두 합산
위의 2단계 과정을 거친 값은 Output feature map의 하나의 값을 이룬다.
이 후 일정 보폭(stride)를 이동하여 다음 값을 구하기 위해 연산을 수행한다.
stride를 이용해서 output feature map의 크기를 조절할 수 있다.
zero padding역시 convolution연산 시 output feature map의 크기를 조절하기 위해 사용된다.
위의 그림을 보게 되면 input feature map의 크기가 5x5이고 kernel의 크기가 3x3일 때 output feature map의 크기는 4x4가 나왔다.
이처럼 convolution연산을 거치게 되면 feature map의 크기가 줄어든다. 이 때 zero padding을 사용하면 output feature map의 크기를 키우거나 유지시킬 수 있다.
위의 그림에서 하얀 부분은 0으로 채워진 부분이다. 0으로 주위를 감싼다고 해서 zero padding이라고 부른다.
입력이 4x4이고 kernel이 3x3일 때 output feature map이 4x4가 나오는 것을 확인할 수 있다.
위에서 처럼 convolution layer는 여러가지 요소에 의해 output feature map의 크기가 정해진다.
앞으로 output feature map의 크기를 정하는 수식을 표현할 때 정의는 다음과 같다.
input size | i |
output size | o |
kernel size | k |
zero padding | p |
stride | s |
Output feature map의 크기를 정하는 조건은 크게 4개로 구분될 수 있다.
1. No zero padding, unit strides (zero padding을 사용하지 않고 stride가 1인 경우)
$$o = (i - k) + 1$$
ex) i = 5, k = 3인 경우, o = (5 - 3) + 1 = 4
2. Zero padding, unit strides (zero padding을 사용하고 stride가 1인 경우)
$$o = (i - k) + 2p + 1$$
ex) i = 5, k = 3, p = 1인 경우, o = (5 - 3) + 2 + 1 = 5
3. No zero padding, non-unit strides (zero padding을 사용하지 않고 stride가 1이 아닌 경우)
$$o = [\frac{i - k}{s}] + 1$$
ex) i = 5, k = 3, s = 2 인 경우, o = ((5 - 3) / 2) + 1 = 2
4. Zero padding, non-unit strides (zero padding을 사용하고 stride가 1이 아닌 경우)
$$o = [\frac{i + 2p - k}{s}] + 1$$
ex) i = 5, k = 3, p = 1, s = 2인 경우, o = ((5 + 2 - 3) / 2) + 1 = 3
여기까지는 문제가 없다.
하지만 다음의 상황에서는 의문이 생긴다.
i = 6, k = 3, s = 2와 같은 경우이다.
일반적으로 convolution 옵션에 padding 옵션에 same을 주고 stride = (1 ,1) 옵션을 주게 되면 i와 o가 같게 나온다.
위와 같은 조건으로 convolution 함수를 수행하면 3 x 3의 사이즈를 갖는 output feature map을 얻게 된다.
그림으로 보면 아래와 같다.
총 세번 convolution 연산을 수행하게 되는데 이 때 우측과 아래로 한 줄씩 비게 된다.
이런 경우에는 아래와 같이 padding을 주게 된다.
빈 공간에 값을 채워줘야 하기 때문에 해당 부분을 zero padding으로 채워주게 된다.
따라서 출력이 3 x 3이 나오게 된다.
식으로 풀게 되면 3 = ((6 + 2p - 3) / 2 + 1)이 되는데 p가 0.5가 되더라...
'Deep learning' 카테고리의 다른 글
convolution transpose/ conv2d_transpose (0) | 2020.04.20 |
---|---|
Pandas/DataFrame 함수(1) (0) | 2019.02.23 |