l2norm_layer

forward_l2norm_layer

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

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

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 ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Last updated

Was this helpful?