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.