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?