DarkNet 시리즈 - L2norm Layer
l2norm_layer
forward_l2norm_layer
1
2
3
4
5
void forward_l2norm_layer(const layer l, network net)
{
copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
l2normalize_cpu(l.output, l.scales, l.batch, l.out_c, l.out_w*l.out_h);
}
함수 이름: forward_l2norm_layer
입력:
- layer l
- network net
동작:
- 입력으로 들어온 네트워크에서 l2norm 레이어를 forward propagation 한다.
- 입력값을 복사하고 l2normalize 함수를 호출한다.
설명:
- l2norm 레이어: 입력값을 L2 norm으로 정규화하는 레이어
- copy_cpu(a, x, incx, y, incy): x에서 y로 a개의 원소를 복사한다.
- l2normalize_cpu(x, norm, batch, filters, spatial): x의 각 batch에서 filters* spatial의 범위에서 L2 norm으로 정규화한다. 이 때, 각 filters마다 각각 스케일값이 있으며 norm 배열에 저장되어 있다.
backward_l2norm_layer
1
2
3
4
5
void backward_l2norm_layer(const layer l, network net)
{
//axpy_cpu(l.inputs*l.batch, 1, l.scales, 1, l.delta, 1);
axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1);
}
함수 이름: backward_l2norm_layer
입력:
- const layer l: 레이어 정보를 담고 있는 구조체 포인터
- network net: 신경망 정보를 담고 있는 구조체
동작:
- 입력값으로 받은 레이어와 신경망 정보를 이용하여 L2 normalization을 수행한 결과 값을 이용하여 역전파를 진행함
- l.delta 값을 이용하여 net.delta 값을 계산하고 업데이트함
설명:
- 입력값으로 받은 레이어 정보에서 l.delta 값은 해당 레이어에서의 역전파에 대한 오차값을 나타냄
- 이전 레이어에서 역전파할 때 이용할 net.delta 값을 axpy_cpu 함수를 이용하여 업데이트함
make_l2norm_layer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
layer make_l2norm_layer(int batch, int inputs)
{
fprintf(stderr, "l2norm %4d\n", inputs);
layer l = {0};
l.type = L2NORM;
l.batch = batch;
l.inputs = inputs;
l.outputs = inputs;
l.output = calloc(inputs*batch, sizeof(float));
l.scales = calloc(inputs*batch, sizeof(float));
l.delta = calloc(inputs*batch, sizeof(float));
l.forward = forward_l2norm_layer;
l.backward = backward_l2norm_layer;
return l;
}
함수 이름: make_l2norm_layer
입력:
- batch: int 타입. 미니배치 크기
- inputs: int 타입. 입력 데이터의 차원 수
동작:
- L2 normalization을 수행하는 layer를 생성한다.
설명:
- 입력 데이터의 크기는 batch * inputs이다.
- 출력 데이터의 크기도 batch * inputs이다.
- l.scales, l.delta, l.output은 모두 크기가 batch * inputs인 float형 배열이다.
- 이 layer의 forward pass는 입력 데이터를 l2normalize_cpu() 함수를 사용하여 L2 normalization을 수행한다.
- 이 layer의 backward pass는 입력 데이터의 미분을 계산하고, 이를 이전 레이어로 전파한다.
- 생성된 layer 구조체를 반환한다.
This post is licensed under CC BY 4.0 by the author.