avgpool

Average Pooling Layer λž€?

Feature Map의 평균 값을 계산해 μ „νŒŒμ‹œν‚€λŠ” Layer μž…λ‹ˆλ‹€.

//avgpool_layer.h

typedef layer avgpool_layer;

make_avgpool_layer

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

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

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)도 λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.

된

Last updated

Was this helpful?