reorg_layer
forward_reorg_layer
void forward_reorg_layer(const layer l, network net)
{
int i;
if(l.flatten){
memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float));
if(l.reverse){
flatten(l.output, l.w*l.h, l.c, l.batch, 0);
}else{
flatten(l.output, l.w*l.h, l.c, l.batch, 1);
}
} else if (l.extra) {
for(i = 0; i < l.batch; ++i){
copy_cpu(l.inputs, net.input + i*l.inputs, 1, l.output + i*l.outputs, 1);
}
} else if (l.reverse){
reorg_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output);
} else {
reorg_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output);
}
}
ํจ์ ์ด๋ฆ: forward_reorg_layer
์ ๋ ฅ:
layer l (reorg layer์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ตฌ์กฐ์ฒด)
network net (์ ๊ฒฝ๋ง ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ตฌ์กฐ์ฒด)
๋์:
reorg ๋ ์ด์ด์ forward propagation์ ์ํํ๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ reorg ์ฐ์ฐ์ ํตํด ์ถ๋ ฅ์ผ๋ก ๋ณํํ๋ค.
์ค๋ช :
์ ๋ ฅ ๋ฐ์ดํฐ๋ l.input์ ์ ์ฅ๋์ด ์์ผ๋ฉฐ, l.output์ ์ถ๋ ฅ์ด ์ ์ฅ๋๋ค. ๋ง์ฝ l.flatten์ด ์ฐธ์ด๋ฉด ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ flattenํ๊ณ , l.reverse๊ฐ ์ฐธ์ด๋ฉด ์ญ์์ผ๋ก ์ ๋ ฌํ๋ค.
l.extra๊ฐ ์ฐธ์ด๋ฉด ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ reorg ํจ์๋ก ์ฒ๋ฆฌํ์ฌ ์ถ๋ ฅ์ผ๋ก ์ ์ฅํ๋ค.
backward_reorg_layer
void backward_reorg_layer(const layer l, network net)
{
int i;
if(l.flatten){
memcpy(net.delta, l.delta, l.outputs*l.batch*sizeof(float));
if(l.reverse){
flatten(net.delta, l.w*l.h, l.c, l.batch, 1);
}else{
flatten(net.delta, l.w*l.h, l.c, l.batch, 0);
}
} else if(l.reverse){
reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta);
} else if (l.extra) {
for(i = 0; i < l.batch; ++i){
copy_cpu(l.inputs, l.delta + i*l.outputs, 1, net.delta + i*l.inputs, 1);
}
}else{
reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta);
}
}
ํจ์ ์ด๋ฆ: backward_reorg_layer
์ ๋ ฅ:
layer l (reorg layer์ ์ ๋ณด๋ฅผ ๋ด์ ๊ตฌ์กฐ์ฒด)
network net (ํ์ฌ์ ์ ๊ฒฝ๋ง ๊ตฌ์กฐ)
๋์:
reorg ๋ ์ด์ด์ ์ญ์ ํ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฅ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค.
์ค๋ช :
l.flatten์ด ์ฐธ์ผ ๊ฒฝ์ฐ, l.delta์์ net.delta๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ , l.reverse๊ฐ ์ฐธ์ด๋ฉด flatten(l.delta, l.wl.h, l.c, l.batch, 1)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด flatten(l.delta, l.wl.h, l.c, l.batch, 0)๋ฅผ ํธ์ถํฉ๋๋ค.
l.reverse๊ฐ ์ฐธ์ด๋ฉด, reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta)๋ฅผ ํธ์ถํฉ๋๋ค.
l.extra๊ฐ ์ฐธ์ผ ๊ฒฝ์ฐ, l.delta์์ net.delta๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta)๋ฅผ ํธ์ถํฉ๋๋ค.
resize_reorg_layer
void resize_reorg_layer(layer *l, int w, int h)
{
int stride = l->stride;
int c = l->c;
l->h = h;
l->w = w;
if(l->reverse){
l->out_w = w*stride;
l->out_h = h*stride;
l->out_c = c/(stride*stride);
}else{
l->out_w = w/stride;
l->out_h = h/stride;
l->out_c = c*(stride*stride);
}
l->outputs = l->out_h * l->out_w * l->out_c;
l->inputs = l->outputs;
int output_size = l->outputs * l->batch;
l->output = realloc(l->output, output_size * sizeof(float));
l->delta = realloc(l->delta, output_size * sizeof(float));
}
ํจ์ ์ด๋ฆ: resize_reorg_layer
์ ๋ ฅ:
layer *l: reorg layer์ ํฌ์ธํฐ
int w: ์๋ก์ด ๊ฐ๋ก ํฌ๊ธฐ
int h: ์๋ก์ด ์ธ๋ก ํฌ๊ธฐ
๋์:
reorg layer์ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์๋ก์ด ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ , ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ reorgํ ๊ฒฐ๊ณผ์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
์ดํ, output๊ณผ delta ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ค๋ช :
์ด ํจ์๋ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ reorgํ๋ layer์ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , output๊ณผ delta ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ค์ ํ ๋นํฉ๋๋ค.
์ด ๋, reverse ํ๋๊ทธ์ ๋ฐ๋ผ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค. ํจ์ ๋ด์์๋ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ reorgํ ๊ฒฐ๊ณผ์ ๊ฐ๋ก, ์ธ๋ก, ์ฑ๋ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ดํ, output๊ณผ delta ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉฐ, realloc ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ํ ๋นํฉ๋๋ค.
make_reorg_layer
layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse, int flatten, int extra)
{
layer l = {0};
l.type = REORG;
l.batch = batch;
l.stride = stride;
l.extra = extra;
l.h = h;
l.w = w;
l.c = c;
l.flatten = flatten;
if(reverse){
l.out_w = w*stride;
l.out_h = h*stride;
l.out_c = c/(stride*stride);
}else{
l.out_w = w/stride;
l.out_h = h/stride;
l.out_c = c*(stride*stride);
}
l.reverse = reverse;
l.outputs = l.out_h * l.out_w * l.out_c;
l.inputs = h*w*c;
if(l.extra){
l.out_w = l.out_h = l.out_c = 0;
l.outputs = l.inputs + l.extra;
}
if(extra){
fprintf(stderr, "reorg %4d -> %4d\n", l.inputs, l.outputs);
} else {
fprintf(stderr, "reorg /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c);
}
int output_size = l.outputs * batch;
l.output = calloc(output_size, sizeof(float));
l.delta = calloc(output_size, sizeof(float));
l.forward = forward_reorg_layer;
l.backward = backward_reorg_layer;
return l;
}
ํจ์ ์ด๋ฆ: make_reorg_layer
์ ๋ ฅ:
batch (int): ๋ฐฐ์น ํฌ๊ธฐ
w (int): ์ ๋ ฅ ๋๋น
h (int): ์ ๋ ฅ ๋์ด
c (int): ์ ๋ ฅ ์ฑ๋ ์
stride (int): ์คํธ๋ผ์ด๋ ๊ฐ
reverse (int): ์ญ๋ฐฉํฅ ์ฌ๋ถ
flatten (int): ํ๋ํผ ์ฌ๋ถ
extra (int): ์ถ๊ฐ ๊ฐ
๋์:
Reorg ๋ ์ด์ด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
์ค๋ช :
์ ๋ ฅ ํฌ๊ธฐ์ ์คํธ๋ผ์ด๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
reverse ๊ฐ์ด true์ด๋ฉด ์ถ๋ ฅ ํฌ๊ธฐ๋ w์ h๋ฅผ stride๋ฐฐ ํ๋ํ๊ณ c๋ฅผ stride^2๋ก ์ถ์ํฉ๋๋ค. false์ด๋ฉด ์ถ๋ ฅ ํฌ๊ธฐ๋ w์ h๋ฅผ stride๋ฐฐ ์ถ์ํ๊ณ c๋ฅผ stride^2๋ฐฐ ํ๋ํฉ๋๋ค.
flatten ๊ฐ์ด true์ด๋ฉด ์ ๋ ฅ๊ฐ์ด ํํํ(flatten)๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ , delta ๊ฐ์ ๋ณต์ฌํฉ๋๋ค.
extra ๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ์ถ๋ ฅ ํฌ๊ธฐ ๋์ ์ extra๊ฐ์ outputs์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
output๊ณผ delta ๋ฐฐ์ด์ ๋์ ํ ๋นํ๊ณ , forward์ backward ํจ์๋ฅผ ์ค์ ํฉ๋๋ค.
์์ฑ๋ Reorg ๋ ์ด์ด๋ฅผ ๋ฐํํฉ๋๋ค.
Last updated
Was this helpful?