Post

DarkNet 시리즈 - Avgpool

avgpool

Average Pooling Layer 란?

Feature Map의 평균 값을 계산해 전파시키는 Layer 입니다.

1
2
3
//avgpool_layer.h

typedef layer avgpool_layer;

make_avgpool_layer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
avgpool_layer make_avgpool_layer(int batch, int w, int h, int c)
{
    fprintf(stderr, "avg                     %4d x%4d x%4d   ->  %4d\n",  w, h, c, c);
    avgpool_layer l = {0};
    l.type = AVGPOOL;
    l.batch = batch;
    l.h = h;
    l.w = w;
    l.c = c;
    l.out_w = 1;
    l.out_h = 1;
    l.out_c = c;
    l.outputs = l.out_c;
    l.inputs = h*w*c;
    int output_size = l.outputs * batch;
    l.output =  calloc(output_size, sizeof(float));
    l.delta =   calloc(output_size, sizeof(float));
    l.forward = forward_avgpool_layer;
    l.backward = backward_avgpool_layer;

    return l;
}

함수 이름: make_avgpool_layer

입력:

  • batch: 배치 크기
  • w: 너비
  • h: 높이
  • c: 채널 수

동작:

  • Average pooling 레이어를 생성합니다.

설명:

  • 이 함수는 Average pooling 레이어를 생성합니다.
  • 입력으로는 배치 크기(batch), 너비(w), 높이(h), 채널 수(c)를 받습니다.
  • 함수는 먼저 생성된 레이어를 초기화하고, 필드에 각 값을 할당합니다. 그 다음, 출력 크기와 입력 크기를 계산하고, 메모리를 동적으로 할당합니다. 이 함수에서는 l.output과 l.delta를 메모리 할당합니다.
  • 마지막으로, 레이어의 forward와 backward 함수를 각각 forward_avgpool_layer와 backward_avgpool_layer 함수로 설정하고, 레이어를 반환합니다.
  • Average pooling 레이어는 입력 데이터를 정해진 영역으로 나누어 각 영역의 평균값을 계산합니다. 이를 통해 입력 데이터의 공간적인 정보를 유지하면서, 데이터의 크기를 줄일 수 있습니다. 이는 Convolutional Neural Network에서 특징 맵의 크기를 줄이는데에 주로 사용됩니다.

forward_avgpool_layer

void forward_avgpool_layer(const avgpool_layer l, network net)
{
    int b,i,k;

    for(b = 0; b < l.batch; ++b){
        for(k = 0; k < l.c; ++k){
            int out_index = k + b*l.c;
            l.output[out_index] = 0;
            for(i = 0; i < l.h*l.w; ++i){
                int in_index = i + l.h*l.w*(k + b*l.c);
                l.output[out_index] += net.input[in_index];
            }
            l.output[out_index] /= l.h*l.w;
        }
    }
}

함수 이름: forward_avgpool_layer

입력:

  • l: avgpool_layer 구조체
  • net: network 구조체

동작:

  • Average pooling 레이어의 forward 연산을 수행합니다.

설명:

  • 이 함수는 Average pooling 레이어의 forward 연산을 수행합니다. 입력으로는 avgpool_layer 구조체와 network 구조체를 받습니다.
  • 함수는 먼저 입력 데이터를 순회하면서, 입력 데이터를 필터 크기(h, w)로 나누어 평균값을 계산합니다. 이를 통해 출력 데이터의 크기를 줄입니다. 이후 평균값을 출력 데이터에 저장합니다.
  • Average pooling 레이어는 입력 데이터를 정해진 영역으로 나누어 각 영역의 평균값을 계산합니다. 이를 통해 입력 데이터의 공간적인 정보를 유지하면서, 데이터의 크기를 줄일 수 있습니다. 이는 Convolutional Neural Network에서 특징 맵의 크기를 줄이는데에 주로 사용됩니다.

backward_avgpool_layer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void backward_avgpool_layer(const avgpool_layer l, network net)
{
    int b,i,k;

    for(b = 0; b < l.batch; ++b){
        for(k = 0; k < l.c; ++k){
            int out_index = k + b*l.c;
            for(i = 0; i < l.h*l.w; ++i){
                int in_index = i + l.h*l.w*(k + b*l.c);
                net.delta[in_index] += l.delta[out_index] / (l.h*l.w);
            }
        }
    }
}

함수 이름: backward_avgpool_layer

입력:

  • l: avgpool 레이어 구조체
  • net: 네트워크 구조체

동작:

  • 이 함수는 avgpool 레이어의 역전파(backpropagation)를 수행한다.
  • 입력값으로 avgpool 레이어 구조체 l과 네트워크 구조체 net을 받아들인다.
  • 각 배치(b)와 필터(k)에 대해, 델타값(delta)의 평균을 계산하고, 이를 각각의 입력값에 더해주어 역전파를 수행한다.
  • 이를 통해 avgpool 레이어의 입력값에 대한 미분값(gradient)을 계산할 수 있다.

설명:

  • 이 함수는 avgpool 레이어의 역전파를 구현한 것이다.
  • avgpool 레이어는 입력값을 작은 사각 영역으로 나누어 평균값을 구한 후 출력값으로 내보내는 레이어이다. 따라서 이 함수에서는 각각의 입력값에 대한 미분값을 구하는 것이 핵심이다.
  • 델타값(delta)는 출력값과 동일한 차원을 가지고 있으며, 이 값은 이전 레이어의 미분값을 받아들이는 역할을 한다.
  • 역전파 과정에서는, 이전 레이어의 미분값과 현재 레이어의 출력값을 이용하여 현재 레이어의 입력값에 대한 미분값을 계산한다.
  • avgpool 레이어의 경우 입력값을 평균화하는 과정이 필요하므로, 델타값의 평균을 구하여 각각의 입력값에 더해주어야 한다.
  • 이를 위해 출력값의 인덱스(out_index)와 입력값의 인덱스(in_index)를 계산하여 값을 업데이트한다.

resize_avgpool_layer

1
2
3
4
5
6
void resize_avgpool_layer(avgpool_layer *l, int w, int h)
{
    l->w = w;
    l->h = h;
    l->inputs = h*w*l->c;
}

함수 이름: resize_avgpool_layer

입력:

  • l: avgpool_layer 구조체 포인터
  • w: 너비
  • h: 높이

동작:

  • Average pooling 레이어의 입력 데이터 크기를 조정한다.

설명:

  • 이 함수는 Average pooling 레이어의 입력 데이터 크기를 조정하는데 사다.
  • 입력으로는 avgpool_layer 구조체 포인터와 새로운 입력 이미지의 폭(w)과 높이(h)를 받는다.
  • 이 함수는 Average pooling 레이어의 w, h, inputs 변수를 입력받은 값으로 갱신한다.
  • 이때, c는 그대로 유지된다.
  • Average pooling 레이어는 입력 데이터를 필터 크기(h, w)로 나누어 평균값을 계산하기 때문에, 입력 이미지 크기가 바뀌면 입력 데이터 크기(inputs)도 바뀌어야 한다.

This post is licensed under CC BY 4.0 by the author.