cost_layer

Loss๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ layer์ž…๋‹ˆ๋‹ค.

COST_TYPE

typedef enum{
    SSE, MASKED, L1, SEG, SMOOTH,WGAN
} COST_TYPE;

์œ„ ์ฝ”๋“œ๋Š” COST_TYPE๋ผ๋Š” ์—ด๊ฑฐํ˜•(enum)์„ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. COST_TYPE์€ ๋„คํŠธ์›Œํฌ์˜ ์†์‹ค ํ•จ์ˆ˜(loss function)๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์—ด๊ฑฐํ˜•์€ ๋‹ค์„ฏ ๊ฐ€์ง€์˜ ์ƒ์ˆ˜(constant)๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • SSE : ํ‰๊ท  ์ œ๊ณฑ ์˜ค์ฐจ(Mean Squared Error, MSE) ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’๊ณผ ์˜ˆ์ธก ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ์ œ๊ณฑํ•œ ํ›„ ๋ชจ๋“  ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ‰๊ท ์„ ์ทจํ•œ ๊ฐ’์œผ๋กœ, ์˜ˆ์ธก์ด ์ •ํ™•ํ• ์ˆ˜๋ก ๊ฐ’์ด ์ž‘์•„์ง‘๋‹ˆ๋‹ค.

  • MASKED : ๋งˆ์Šคํฌ(mask)๋ฅผ ์ ์šฉํ•œ ํ‰๊ท  ์ œ๊ณฑ ์˜ค์ฐจ ์†์‹ค ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋งˆ์Šคํฌ๋Š” ์ผ๋ถ€ ์ž…๋ ฅ์„ ๋ฌด์‹œํ•˜๊ณ  ์†์‹ค์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • L1 : ์ ˆ๋Œ€ ์˜ค์ฐจ(Absolute Error) ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’๊ณผ ์˜ˆ์ธก ๊ฐ’์˜ ์ฐจ์ด์˜ ์ ˆ๋Œ“๊ฐ’์— ๋Œ€ํ•ด ๋ชจ๋“  ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ‰๊ท ์„ ์ทจํ•œ ๊ฐ’์œผ๋กœ, ์˜ˆ์ธก์ด ์ •ํ™•ํ• ์ˆ˜๋ก ๊ฐ’์ด ์ž‘์•„์ง‘๋‹ˆ๋‹ค.

  • SEG : ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜(segmentation) ๋ฌธ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ(Cross-Entropy) ์†์‹ค ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ๊ฐ ํ”ฝ์…€์ด ํด๋ž˜์Šค(class)์— ์†ํ•  ํ™•๋ฅ ์„ ์˜ˆ์ธกํ•˜๊ณ , ์ด ์˜ˆ์ธก ๊ฐ’๊ณผ ์‹ค์ œ ํด๋ž˜์Šค ๊ฐ’์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์†์‹ค์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  • SMOOTH : ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ๋ฌธ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ์Šค๋ฌด๋”ฉ(smoothing)๋œ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์†์‹ค ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. SEG์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์˜ˆ์ธก๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’ ๊ฐ„์˜ ์˜ค์ฐจ๋ฅผ ํ‰ํ™œํ™”(smoothing)ํ•˜์—ฌ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ค ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • WGAN : ์ƒ์„ฑ์  ์ ๋Œ€ ์‹ ๊ฒฝ๋ง(Generative Adversarial Network, GAN)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†์‹ค ํ•จ์ˆ˜์ธ Wasserstein GAN ์†์‹ค ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. GAN์€ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์— ํ™œ์šฉ๋˜๋Š” ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ๋กœ, WGAN ์†์‹ค ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€์™€ ์‹ค์ œ ์ด๋ฏธ์ง€ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋ธ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

get_cost_type

COST_TYPE get_cost_type(char *s)
{
    if (strcmp(s, "seg")==0) return SEG;
    if (strcmp(s, "sse")==0) return SSE;
    if (strcmp(s, "masked")==0) return MASKED;
    if (strcmp(s, "smooth")==0) return SMOOTH;
    if (strcmp(s, "L1")==0) return L1;
    if (strcmp(s, "wgan")==0) return WGAN;
    fprintf(stderr, "Couldn't find cost type %s, going with SSE\n", s);
    return SSE;
}

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

์ž…๋ ฅ:

  • s: ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ

๋™์ž‘:

  • ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด s์™€ COST_TYPE ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” COST_TYPE์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” COST_TYPE์ด ์—†์œผ๋ฉด "Couldn't find cost type %s, going with SSE" ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  SSE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…:

  • get_cost_type ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด s๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์ด์— ๋Œ€์‘ํ•˜๋Š” COST_TYPE์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด s๋ฅผ SEG, SSE, MASKED, SMOOTH, L1, WGAN๊ณผ ์ฐจ๋ก€๋Œ€๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์ผ์น˜ํ•˜๋Š” COST_TYPE ์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์—†์„ ๊ฒฝ์šฐ fprintf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "Couldn't find cost type %s, going with SSE" ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  SSE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ COST_TYPE ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

get_cost_string

char *get_cost_string(COST_TYPE a)
{
    switch(a){
        case SEG:
            return "seg";
        case SSE:
            return "sse";
        case MASKED:
            return "masked";
        case SMOOTH:
            return "smooth";
        case L1:
            return "L1";
        case WGAN:
            return "wgan";
    }
    return "sse";
}

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

์ž…๋ ฅ:

  • a: COST_TYPE ํƒ€์ž…์˜ ๋ณ€์ˆ˜

๋™์ž‘:

  • a์— ํ•ด๋‹นํ•˜๋Š” COST_TYPE์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์„ค๋ช…:

  • ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ COST_TYPE a์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • switch ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ a๊ฐ€ ๊ฐ๊ฐ์˜ COST_TYPE์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๋งŒ์•ฝ a๊ฐ€ ์–ด๋– ํ•œ COST_TYPE์—๋„ ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ "sse" ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

forward_cost_layer

void forward_cost_layer(cost_layer l, network net)
{
    if (!net.truth) return;
    if(l.cost_type == MASKED){
        int i;
        for(i = 0; i < l.batch*l.inputs; ++i){
            if(net.truth[i] == SECRET_NUM) net.input[i] = SECRET_NUM;
        }
    }
    if(l.cost_type == SMOOTH){
        smooth_l1_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output);
    }else if(l.cost_type == L1){
        l1_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output);
    } else {
        l2_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output);
    }
    l.cost[0] = sum_array(l.output, l.batch*l.inputs);
}

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

์ž…๋ ฅ:

  • cost_layer l: ๋น„์šฉ ๊ณ„์‚ฐ ๋ ˆ์ด์–ด ๊ตฌ์กฐ์ฒด

  • network net: ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ์ฒด

๋™์ž‘:

  • net.truth์ด ์กด์žฌํ•˜๋ฉด ์‹คํ–‰

    • l.cost_type์ด MASKED์ผ ๊ฒฝ์šฐ, SECRET_NUM์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฐ’์ด ์žˆ๋Š” ์œ„์น˜๋Š” net.input ๊ฐ’๋„ SECRET_NUM์œผ๋กœ ๋ณ€๊ฒฝ

    • l.cost_type์ด SMOOTH์ผ ๊ฒฝ์šฐ, smooth L1 ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ l.delta์™€ l.output์— ์ €์žฅ

    • l.cost_type์ด L1์ผ ๊ฒฝ์šฐ, L1 ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ l.delta์™€ l.output์— ์ €์žฅ

    • l.cost_type์ด ๊ทธ ์™ธ์ผ ๊ฒฝ์šฐ, L2 ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ l.delta์™€ l.output์— ์ €์žฅ

  • l.output์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์„ l.cost[0]์— ์ €์žฅ

์„ค๋ช…:

  • ๋น„์šฉ ๊ณ„์‚ฐ ๋ ˆ์ด์–ด๋Š” ์‹ ๊ฒฝ๋ง์˜ ์˜ˆ์ธก ๊ฒฐ๊ณผ์™€ ์‹ค์ œ ๊ฒฐ๊ณผ์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๋น„์šฉ ๊ณ„์‚ฐ ๋ ˆ์ด์–ด์™€ ์‹ ๊ฒฝ๋ง์„ ์ด์šฉํ•˜์—ฌ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜๊ณ , ๊ณ„์‚ฐ๋œ ๋น„์šฉ์„ l.cost[0]์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋˜ํ•œ, l.cost_type์— ๋”ฐ๋ผ์„œ ์˜ˆ์ธก ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ l.delta์™€ l.output์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋•Œ, l.cost_type์ด MASKED์ผ ๊ฒฝ์šฐ, SECRET_NUM์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฐ’์ด ์žˆ๋Š” ์œ„์น˜๋Š” net.input ๊ฐ’๋„ SECRET_NUM์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋น„์šฉ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

.

backward_cost_layer

void backward_cost_layer(const cost_layer l, network net)
{
    axpy_cpu(l.batch*l.inputs, l.scale, l.delta, 1, net.delta, 1);
}

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

์ž…๋ ฅ:

  • cost_layer l

  • network net

๋™์ž‘:

  • cost_layer์˜ gradient๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ด๋ฅผ network์˜ delta๊ฐ’์— ๋”ํ•ด์ค€๋‹ค.

  • ์ด ๋•Œ, l.scale์€ gradient์˜ ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์Šค์ผ€์ผ๋ง ์ธ์ž์ด๋‹ค.

์„ค๋ช…:

  • cost_layer์˜ gradient๋Š” delta ๋ฐฐ์—ด์— ์ €์žฅ๋œ๋‹ค.

  • axpy_cpu ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด net.delta ๋ฐฐ์—ด์— l.delta ๋ฐฐ์—ด์„ l.scale๋งŒํผ ์Šค์ผ€์ผ๋งํ•˜์—ฌ ๋”ํ•ด์ค€๋‹ค.

  • ์ด ๋•Œ, ๋‘ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” l.batch*l.inputs์ด๋‹ค.

  • ์ฆ‰, cost_layer๋ฅผ ํ†ตํ•ด ๊ตฌํ•œ gradient๋Š” network์˜ ๋‹ค์Œ layer๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ์ดํ›„์— backward propagation์ด ์ด์–ด์ ธ์„œ gradient๊ฐ€ ์—ญ์ „ํŒŒ๋˜๊ฒŒ ๋œ๋‹ค.

resize_cost_layer

void resize_cost_layer(cost_layer *l, int inputs)
{
    l->inputs = inputs;
    l->outputs = inputs;
    l->delta = realloc(l->delta, inputs*l->batch*sizeof(float));
    l->output = realloc(l->output, inputs*l->batch*sizeof(float));
}

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

์ž…๋ ฅ:

  • l: cost_layer ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ

  • inputs: int

๋™์ž‘:

  • cost_layer ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ l์˜ inputs์™€ outputs ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , delta์™€ output ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ realloc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ• ๋‹นํ•œ๋‹ค.

์„ค๋ช…:

  • ํ•จ์ˆ˜๋Š” cost_layer ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • l์˜ inputs์™€ outputs ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

  • realloc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ l->delta ๋ฐฐ์—ด๊ณผ l->output ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ inputsl->batchsizeof(float)์œผ๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” resize_network ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœ๋˜๋ฉฐ, ์‹ ๊ฒฝ๋ง์„ ์žฌ์กฐ์ •ํ•  ๋•Œ cost_layer๋„ ํ•จ๊ป˜ ์กฐ์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค.

make_cost_layer

cost_layer make_cost_layer(int batch, int inputs, COST_TYPE cost_type, float scale)
{
    fprintf(stderr, "cost                                           %4d\n",  inputs);
    cost_layer l = {0};
    l.type = COST;

    l.scale = scale;
    l.batch = batch;
    l.inputs = inputs;
    l.outputs = inputs;
    l.cost_type = cost_type;
    l.delta = calloc(inputs*batch, sizeof(float));
    l.output = calloc(inputs*batch, sizeof(float));
    l.cost = calloc(1, sizeof(float));

    l.forward = forward_cost_layer;
    l.backward = backward_cost_layer;

    return l;
}

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

์ž…๋ ฅ:

  • int batch: batch size

  • int inputs: layer์˜ input dimension

  • COST_TYPE cost_type: cost function type

  • float scale: cost์˜ ํฌ๊ธฐ ์กฐ์ ˆ์„ ์œ„ํ•œ ์Šค์ผ€์ผ ๊ฐ’

๋™์ž‘:

  • cost_layer ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•„๋“œ๊ฐ’๋“ค์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  • ์ž…๋ ฅ๋ฐ›์€ cost_type์— ๋”ฐ๋ผ์„œ l.cost_type์„ ์„ค์ •ํ•œ๋‹ค.

  • l.delta, l.output, l.cost ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  • forward์™€ backward ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

์„ค๋ช…:

  • ์ด ํ•จ์ˆ˜๋Š” cost layer๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ์ž…๋ ฅ๊ฐ’๋“ค์„ ๋ฐ›์•„์„œ cost layer์˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ cost layer๋Š” neural network์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

Last updated

Was this helpful?