maxpool

Max Pooling Layer ๋ž€?

Max Pooling Layer๋Š” Convolutional Neural Network(CNN)์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. CNN์€ ์ด๋ฏธ์ง€, ์Œ์„ฑ ๋˜๋Š” ๋น„๋””์˜ค์™€ ๊ฐ™์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์˜ Convolutional Layer์—์„œ ์ƒ์„ฑ๋œ feature map์„ ๋‹ค์šด ์ƒ˜ํ”Œ๋งํ•˜์—ฌ ๊ณต๊ฐ„ ํ•ด์ƒ๋„๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ๊ฐ€ ๊ณผ์ ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Max Pooling Layer๋Š” ๊ฐ feature map์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด feature map์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๊ณ , ์ด๋ฏธ์ง€์˜ ์œ„์น˜ ์ด๋™์— ๋Œ€ํ•œ ๋ถˆ๋ณ€์„ฑ(invariance)์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๊ฐœ์˜ ์–ผ๊ตด์ด ์žˆ์„ ๋•Œ, ๊ฐœ์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ Max Pooling Layer๋Š” ๊ฐœ์˜ ํŠน์ง•์„ ์ธ์‹ํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, Max Pooling Layer๋Š” 2x2์˜ ์œˆ๋„์šฐ์™€ 2์˜ ์ŠคํŠธ๋ผ์ด๋“œ(stride)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž…๋ ฅ feature map์„ 2๋ฐฐ๋กœ ๋‹ค์šด์ƒ˜ํ”Œ๋งํ•˜์—ฌ ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œˆ๋„์šฐ ํฌ๊ธฐ์™€ ์ŠคํŠธ๋ผ์ด๋“œ ํฌ๊ธฐ๋Š” ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Max Pooling Layer๋Š” ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๊ณผ์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

make_maxpool_layer

maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int stride, int padding)
{
    maxpool_layer l = {0};
    l.type = MAXPOOL;
    l.batch = batch;
    l.h = h;
    l.w = w;
    l.c = c;
    l.pad = padding;
    l.out_w = (w + padding - size)/stride + 1;
    l.out_h = (h + padding - size)/stride + 1;
    l.out_c = c;
    l.outputs = l.out_h * l.out_w * l.out_c;
    l.inputs = h*w*c;
    l.size = size;
    l.stride = stride;
    int output_size = l.out_h * l.out_w * l.out_c * batch;
    l.indexes = calloc(output_size, sizeof(int));
    l.output =  calloc(output_size, sizeof(float));
    l.delta =   calloc(output_size, sizeof(float));
    l.forward = forward_maxpool_layer;
    l.backward = backward_maxpool_layer;

    fprintf(stderr, "max          %d x %d / %d  %4d x%4d x%4d   ->  %4d x%4d x%4d\n", size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c);
    return l;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: make_maxpool_layer

์ž…๋ ฅ:

  • batch: int ํ˜•ํƒœ์˜ ๋ฐฐ์น˜ ํฌ๊ธฐ

  • h: int ํ˜•ํƒœ์˜ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋†’์ด

  • w: int ํ˜•ํƒœ์˜ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋„ˆ๋น„

  • c: int ํ˜•ํƒœ์˜ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜

  • size: int ํ˜•ํƒœ์˜ ๋งฅ์Šคํ’€๋ง ํ•„ํ„ฐ ํฌ๊ธฐ

  • stride: int ํ˜•ํƒœ์˜ ๋งฅ์Šคํ’€๋ง ์ŠคํŠธ๋ผ์ด๋“œ ํฌ๊ธฐ

  • padding: int ํ˜•ํƒœ์˜ ํŒจ๋”ฉ ํฌ๊ธฐ

๋™์ž‘:

  • ๋งฅ์Šคํ’€๋ง ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ๋’ค ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ์ถœ๋ ฅ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ์ˆœ์ „ํŒŒ์™€ ์—ญ์ „ํŒŒ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

์„ค๋ช…:

  • l: maxpool_layer ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜

  • l.type: ๋ ˆ์ด์–ด ํƒ€์ž…์œผ๋กœ MAXPOOL๋กœ ์„ค์ •

  • l.out_c: ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜๋กœ ์ž…๋ ฅ ์ด๋ฏธ์ง€ ์ฑ„๋„ ์ˆ˜์™€ ๊ฐ™๊ฒŒ ์„ค์ •

  • l.outputs: ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ(๋†’์ดx๋„ˆ๋น„x์ฑ„๋„ ์ˆ˜)๋กœ ์ถœ๋ ฅ ํฌ๊ธฐ ๊ณ„์‚ฐ

  • l.inputs: ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ(๋†’์ดx๋„ˆ๋น„x์ฑ„๋„ ์ˆ˜)๋กœ ์ž…๋ ฅ ํฌ๊ธฐ ๊ณ„์‚ฐ

  • l.indexes: ๋งฅ์Šคํ’€๋ง ์—ฐ์‚ฐ์—์„œ ์ตœ๋Œ“๊ฐ’ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ๋™์  ํ• ๋‹น

  • l.output: ๋งฅ์Šคํ’€๋ง ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ๋™์  ํ• ๋‹น

  • l.delta: ์—ญ์ „ํŒŒ ๊ณผ์ •์—์„œ ๊ณ„์‚ฐ๋œ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ๋™์  ํ• ๋‹น

  • l.forward: ๋งฅ์Šคํ’€๋ง ๋ ˆ์ด์–ด์˜ ์ˆœ์ „ํŒŒ ์—ฐ์‚ฐ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์„ค์ •

  • l.backward: ๋งฅ์Šคํ’€๋ง ๋ ˆ์ด์–ด์˜ ์—ญ์ „ํŒŒ ์—ฐ์‚ฐ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์„ค์ •

  • fprintf: ๋””๋ฒ„๊น…์šฉ์œผ๋กœ ๋งฅ์Šคํ’€๋ง ๋ ˆ์ด์–ด์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅ

forward_maxpool_layer

ํ•จ์ˆ˜ ์ด๋ฆ„: forward_maxpool_layer

์ž…๋ ฅ:

  • const maxpool_layer l: Max pooling ๋ ˆ์ด์–ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด

  • network net: ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด

๋™์ž‘:

  • ์ฃผ์–ด์ง„ Max pooling ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด l๊ณผ ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ์ฒด net๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Max pooling ๋ ˆ์ด์–ด๋ฅผ ์ˆœ์ „ํŒŒํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์—์„œ Max pooling ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. Max pooling ์—ฐ์‚ฐ์€ ๊ฐ ์œˆ๋„์šฐ ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์„ค๋ช…:

  • ์ด ํ•จ์ˆ˜๋Š” Max pooling ๋ ˆ์ด์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” forward propagation ํ•จ์ˆ˜์ด๋‹ค. ์ž…๋ ฅ๊ฐ’์œผ๋กœ๋Š” Max pooling ๋ ˆ์ด์–ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด l๊ณผ ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ์ฒด net์ด ์ฃผ์–ด์ง„๋‹ค. Max pooling ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’์€ ๊ตฌ์กฐ์ฒด l์˜ output ๋ฐฐ์—ด์— ์ €์žฅ๋œ๋‹ค. Max pooling ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด, ์ž…๋ ฅ๊ฐ’์—์„œ Max pooling ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ์ž…๋ ฅ๊ฐ’์—์„œ ์œˆ๋„์šฐ๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ๊ฐ ์œˆ๋„์šฐ ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์˜ ๋ฐฐ์น˜ ํฌ๊ธฐ l.batch, ์ถœ๋ ฅ๊ฐ’์˜ ๋†’์ด l.out_h, ์ถœ๋ ฅ๊ฐ’์˜ ๋„ˆ๋น„ l.out_w, ์ฑ„๋„ ์ˆ˜ l.c, ํŒจ๋”ฉ ํฌ๊ธฐ l.pad, ์ŠคํŠธ๋ผ์ด๋“œ ํฌ๊ธฐ l.stride, ์œˆ๋„์šฐ ํฌ๊ธฐ l.size ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ํ•จ์ˆ˜์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’์—์„œ ์œˆ๋„์šฐ๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ๊ฐ ์œˆ๋„์šฐ ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ณ , ๊ตฌ์กฐ์ฒด l์˜ output ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค. ์ตœ๋Œ“๊ฐ’์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐ์ฒด l์˜ indexes ๋ฐฐ์—ด๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’์˜ ๋ชจ๋“  ์œ„์น˜์— ๋Œ€ํ•ด Max pooling ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์ž…๋ ฅ๊ฐ’์˜ ๋ฐฐ์น˜๋ณ„๋กœ, ์ฑ„๋„๋ณ„๋กœ, ์ถœ๋ ฅ๊ฐ’์˜ ์œ„์น˜๋ณ„๋กœ ์ž…๋ ฅ๊ฐ’์—์„œ ์œˆ๋„์šฐ๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ์ž…๋ ฅ๊ฐ’์—์„œ ์œˆ๋„์šฐ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด h_offset๊ณผ w_offset์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ๊ฐ’์€ ํŒจ๋”ฉ ์ •๋ณด์™€ ์ŠคํŠธ๋ผ์ด๋“œ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋œ๋‹ค. ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์„ ๋•Œ๋Š” ์œˆ๋„์šฐ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉด์„œ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค. ์ตœ๋Œ“๊ฐ’์€ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ตœ๋Œ“๊ฐ’์˜ ์œ„์น˜ ์ •๋ณด๋Š” indexes ๋ฐฐ์—ด์— ์ €์žฅ๋œ๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

backward_maxpool_layer

ํ•จ์ˆ˜ ์ด๋ฆ„: backward_maxpool_layer

์ž…๋ ฅ:

  • maxpool_layer l (maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด)

  • network net (๋‰ด๋Ÿด ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ์ฒด)

๋™์ž‘:

  • maxpool ๋ ˆ์ด์–ด์˜ ์—ญ์ „ํŒŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, ๋‰ด๋Ÿด ๋„คํŠธ์›Œํฌ์˜ delta ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  • ์—ญ์ „ํŒŒ ์ˆ˜ํ–‰์„ ์œ„ํ•ด, maxpool ๋ ˆ์ด์–ด์—์„œ ์‚ฌ์šฉ๋œ max ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์›์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๋ฅผ l.indexes ๋ฐฐ์—ด์— ์ €์žฅํ•ด ๋†“์•˜์œผ๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ delta ๊ฐ’์„ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์›์†Œ์— ๋”ํ•ด์ค€๋‹ค.

์„ค๋ช…:

  • ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด l๊ณผ ๋‰ด๋Ÿด ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ์ฒด net์„ ์ด์šฉํ•˜์—ฌ, maxpool ๋ ˆ์ด์–ด์˜ ์—ญ์ „ํŒŒ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • l.indexes ๋ฐฐ์—ด์—๋Š” max ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์›์†Œ๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ net.delta ๋ฐฐ์—ด์˜ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์›์†Œ์— l.delta ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, maxpool ๋ ˆ์ด์–ด๋กœ ์ „๋‹ฌ๋œ ๋ธํƒ€ ๊ฐ’์ด ์ด์ „ ๋ ˆ์ด์–ด๋กœ ์—ญ์ „ํŒŒ๋˜๋ฉฐ, ๋„คํŠธ์›Œํฌ์˜ ํ•™์Šต์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

get_maxpool_image

ํ•จ์ˆ˜ ์ด๋ฆ„: get_maxpool_image

์ž…๋ ฅ:

  • maxpool_layer ๊ตฌ์กฐ์ฒด l

๋™์ž‘:

  • max pooling ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ์ด๋ฏธ์ง€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…:

  • max pooling ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ํŠน์ • ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, float_to_image ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ image ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ถœ๋ ฅ๊ฐ’์„ ์ด๋ฏธ์ง€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ด์œ ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ max pooling ๋ ˆ์ด์–ด๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

get_maxpool_delta

ํ•จ์ˆ˜ ์ด๋ฆ„: get_maxpool_delta

์ž…๋ ฅ:

  • maxpool_layer l (maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด)

๋™์ž‘:

  • ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ maxpool ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ delta ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋Š” float_to_image ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด float ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

์„ค๋ช…:

  • maxpool ๋ ˆ์ด์–ด๋Š” ์ž…๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ์ตœ๋Œ€๊ฐ’ ํ’€๋ง ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ถ•์†Œํ•œ ํ›„ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋•Œ, ์†์‹ค ํ•จ์ˆ˜์˜ ์—ญ์ „ํŒŒ๋ฅผ ์œ„ํ•ด ์ด์ „ ๋ ˆ์ด์–ด์—์„œ ์ „๋‹ฌ๋œ delta ๊ฐ’์„ maxpool ๋ ˆ์ด์–ด์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” ์ด๋Ÿฌํ•œ delta ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€์˜ ๋„ˆ๋น„, ๋†’์ด, ์ฑ„๋„ ์ˆ˜๋Š” maxpool ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ๊ฐ’๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

resize_maxpool_layer

ํ•จ์ˆ˜ ์ด๋ฆ„: resize_maxpool_layer ์ž…๋ ฅ:

  • maxpool_layer *l : maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ

  • int w : ๋ณ€๊ฒฝํ•  ๋„ˆ๋น„

  • int h : ๋ณ€๊ฒฝํ•  ๋†’์ด

๋™์ž‘:

  • ์ž…๋ ฅ๋ฐ›์€ maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ(*l)์˜ w์™€ h ํ•„๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•„๋“œ๋“ค๋„ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐ๋œ ํ•„๋“œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • inputs : ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์ด ๊ฐœ์ˆ˜(h * w * c)

  • out_w : ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ๋„ˆ๋น„

  • out_h : ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ๋†’์ด

  • outputs : ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์ด ๊ฐœ์ˆ˜(out_w * out_h * c)

  • indexes : ์ถœ๋ ฅ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ output_size ํฌ๊ธฐ๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.

  • output : ์ถœ๋ ฅ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ output_size ํฌ๊ธฐ๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.

  • delta : ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๋ฏธ๋ถ„๊ฐ’(gradient)์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ output_size ํฌ๊ธฐ๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.

์„ค๋ช…:

  • ์ด ํ•จ์ˆ˜๋Š” maxpool ๋ ˆ์ด์–ด์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค.

  • ์ž…๋ ฅ๋ฐ›์€ maxpool ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ(*l)์˜ w์™€ h ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค, ์ด ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•„๋“œ๋“ค๋„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด ๋•Œ, maxpool ๋ ˆ์ด์–ด๋Š” ์ž…๋ ฅ ์ด๋ฏธ์ง€์—์„œ stride์™€ size๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ๋Œ“๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ์ถœ๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ ˆ์ด์–ด์ด๋‹ค.

  • ์ด ํ•จ์ˆ˜์—์„œ๋Š” ์ž…๋ ฅ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์ด ๊ฐœ์ˆ˜(inputs), ์ถœ๋ ฅ ์ด๋ฏธ์ง€์˜ ๋„ˆ๋น„(out_w)์™€ ๋†’์ด(out_h), ์ถœ๋ ฅ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์ด ๊ฐœ์ˆ˜(outputs)๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐํ•œ๋‹ค.

  • ๋˜ํ•œ, ์ถœ๋ ฅ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด(indexes), ์ถœ๋ ฅ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด(output), ๊ทธ๋ฆฌ๊ณ  ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๋ฏธ๋ถ„๊ฐ’(gradient)์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด(delta)์„ ์žฌํ• ๋‹นํ•œ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ํ•„๋“œ๋“ค์„ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐํ•˜๊ณ  ์žฌํ• ๋‹นํ•จ์œผ๋กœ์จ, maxpool ๋ ˆ์ด์–ด์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated

Was this helpful?