DarkNet 시리즈 - Layer
layer
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
31
32
33
34
// darknet.h
typedef enum {
CONVOLUTIONAL,
DECONVOLUTIONAL,
CONNECTED,
MAXPOOL,
SOFTMAX,
DETECTION,
DROPOUT,
CROP,
ROUTE,
COST,
NORMALIZATION,
AVGPOOL,
LOCAL,
SHORTCUT,
ACTIVE,
RNN,
GRU,
LSTM,
CRNN,
BATCHNORM,
NETWORK,
XNOR,
REGION,
YOLO,
ISEG,
REORG,
UPSAMPLE,
LOGXENT,
L2NORM,
BLANK
} LAYER_TYPE;
이 코드는 열거형(enum)으로 LAYER_TYPE이라는 타입을 정의하고 있습니다. LAYER_TYPE은 다양한 레이어 유형을 정의하고 있으며, 각 레이어 유형은 해당하는 이름으로 정의되어 있습니다.
다음은 각 레이어 유형과 그에 해당하는 이름입니다.
- CONVOLUTIONAL: 컨볼루션(Convolution) 레이어
- DECONVOLUTIONAL: 디컨볼루션(Deconvolution) 레이어
- CONNECTED: 완전 연결(Fully Connected) 레이어
- MAXPOOL: 맥스 풀링(Max Pooling) 레이어
- SOFTMAX: 소프트맥스(Softmax) 레이어
- DETECTION: 객체 검출(Detection) 레이어
- DROPOUT: 드롭아웃(Dropout) 레이어
- CROP: 크롭(Crop) 레이어
- ROUTE: 루트(Route) 레이어
- COST: 비용(Cost) 레이어
- NORMALIZATION: 정규화(Normalization) 레이어
- AVGPOOL: 평균 풀링(Average Pooling) 레이어
- LOCAL: 로컬(Local) 레이어
- SHORTCUT: 숏컷(Shortcut) 레이어
- ACTIVE: 활성화(Activation) 레이어
- RNN: 순환 신경망(Recurrent Neural Network) 레이어
- GRU: 게이트 순환 유닛(Gated Recurrent Unit) 레이어
- LSTM: 장단기 메모리(Long Short-Term Memory) 레이어
- CRNN: 합성곱 순환 신경망(Convolutional Recurrent Neural Network) 레이어
- BATCHNORM: 배치 정규화(Batch Normalization) 레이어
- NETWORK: 네트워크(Network) 레이어
- XNOR: 이진화(Binary) 레이어
- REGION: 지역(Region) 레이어
- YOLO: YOLO(You Only Look Once) 레이어
- ISEG: 인스턴스 분할(Instance Segmentation) 레이어
- REORG: 리오그(Reorg) 레이어
- UPSAMPLE: 업샘플(Upsample) 레이어
- LOGXENT: 로그-엔트로피(Log-entropy) 레이어
- L2NORM: L2 노름(L2 Norm) 레이어
- BLANK: 빈(Blank) 레이어
이 함수는 LAYER_TYPE이라는 열거형을 정의한 것이므로 입력값과 동작은 없습니다.
free_layer
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void free_layer(layer l)
{
if(l.type == DROPOUT){
if(l.rand) free(l.rand);
return;
}
if(l.cweights) free(l.cweights);
if(l.indexes) free(l.indexes);
if(l.input_layers) free(l.input_layers);
if(l.input_sizes) free(l.input_sizes);
if(l.map) free(l.map);
if(l.rand) free(l.rand);
if(l.cost) free(l.cost);
if(l.state) free(l.state);
if(l.prev_state) free(l.prev_state);
if(l.forgot_state) free(l.forgot_state);
if(l.forgot_delta) free(l.forgot_delta);
if(l.state_delta) free(l.state_delta);
if(l.concat) free(l.concat);
if(l.concat_delta) free(l.concat_delta);
if(l.binary_weights) free(l.binary_weights);
if(l.biases) free(l.biases);
if(l.bias_updates) free(l.bias_updates);
if(l.scales) free(l.scales);
if(l.scale_updates) free(l.scale_updates);
if(l.weights) free(l.weights);
if(l.weight_updates) free(l.weight_updates);
if(l.delta) free(l.delta);
if(l.output) free(l.output);
if(l.squared) free(l.squared);
if(l.norms) free(l.norms);
if(l.spatial_mean) free(l.spatial_mean);
if(l.mean) free(l.mean);
if(l.variance) free(l.variance);
if(l.mean_delta) free(l.mean_delta);
if(l.variance_delta) free(l.variance_delta);
if(l.rolling_mean) free(l.rolling_mean);
if(l.rolling_variance) free(l.rolling_variance);
if(l.x) free(l.x);
if(l.x_norm) free(l.x_norm);
if(l.m) free(l.m);
if(l.v) free(l.v);
if(l.z_cpu) free(l.z_cpu);
if(l.r_cpu) free(l.r_cpu);
if(l.h_cpu) free(l.h_cpu);
if(l.binary_input) free(l.binary_input);
}
함수 이름: free_layer
입력:
- layer 구조체 (layer 타입 포인터 변수 l)
동작:
- layer 구조체에서 동적으로 할당한 모든 메모리를 해제하는 함수.
- DROPOUT 레이어인 경우 l.rand 변수만 해제하고 함수를 종료한다.
설명:
- 이 함수는 입력으로 전달된 layer 구조체에서 동적으로 할당된 모든 메모리를 해제한다.
- 할당된 메모리가 없는 경우 아무런 동작도 하지 않는다. DROPOUT 레이어인 경우 l.rand 변수만 해제하고 함수를 종료한다.
- 나머지 레이어의 경우, layer 구조체에서 사용하는 모든 변수를 순회하며 할당된 메모리가 있는 경우 메모리를 해제한다.
- 각 변수에 대한 메모리 해제는 malloc 함수를 사용하여 할당된 것과 동일한 방식으로 이루어진다.
This post is licensed under CC BY 4.0 by the author.