CNN
Convolution Neural Networks
- convolutioinal matrix
- 주로 3x3, 5x5를 사용한다
- sliding window 방식으로 이미지에서 특징을 추출한다
convolution
- 같은 위치의 원소들의 곱의 합으로 계산
- padding
- 외곽에 0을 채우는 것
- input과 output의 크기가 같기를 원할 때 사용
- stride
- kernel을 적용하는 간격
- 커질수록 연산량이 줄고, output 크기도 작아진다
- output 크기
- output_height = (input_height - kernel_height + padding*2)//stride +1
- output_width = (input_width - kernel_width + padding*2)//stride +1
- 데이터 shape
- input : [batch, in_channel, height, width]
- weight : [out_channel, kernel_channel, kernel_height, kernel_width] (in_channel == kernel_channel)
- output : [batch, out_channel, out_height, out_width]
convolution operation
- convolution 연산량을 셀 때 MAC을 사용
- MAC : Multiply Accumulation operation
- output의 픽셀 하나 연산량 = kernel_width kernel_height kernel_channel
- output의 한 행 연산량 = 1번 * out_channel
- output 하나의 연산량 = 2번 out_width out_height
- 전체 연산량 = 3번 * batch
- 하지만 이 방법은 반복이 너무 많아서 비효율적이다
IM2COL & GEMM
IM2COL
- n차원의 data를 2차원 matrix data로 변환
- 메모리를 조금 더 많이 차지하지만 연산은 효율적이다
GEMM
- General Matrix to Matrix Multiplication
- 이 연산하는 과정을 의미
CNN 구현해보기
1. native 방법으로 구현해보기 (numpy만 사용)
2. IM2COL & GEMM 방법으로 구현해보기
- 위의 그림과는 다르게 input * kernel로 진행된다 (따라서 row, col이 반대)
3. torch를 사용해서 구현해보기
3가지 time 비교
- 동일하게 conv를 5번 수행하였을 때
- native : 0.03708481788635254
- IM2COL & GEMM : 0.0023488998413085938
- torch : 0.0008263587951660156
- IM2COL & GEMM 방법이 일반적인 방법보다 빠르지만 torch를 사용하는 것이 더 빠르다