batchnorm_layer
Batch Normalization ě´ë?
Paper : https://arxiv.org/abs/1502.03167
Gradient Vanishing, Gradient Exploding 돸ě ě
internal covariate shift
: weightě ëłíę° ě¤ě˛Šëě´ ę°ě¤ëë íŹę¸° ëłíę° íŹë¤ë 돸ě ě careful initialization
:Difficult
small learning rate
:Slow
ěě 돸ě 뼟 í´ę˛°í기 ěí íëě ë°Šë˛ ě ëë¤.
ëł´íľ internal covariate shift
뼟 ě¤ě´ę¸° ěí ëíě ě¸ ë°Šë˛ě ę° layerě ě
ë Ľě whiteningě íë ę˛ ě
ëë¤. ěŹę¸°ěě whitening ě´ë íęˇ 0 ëśě° 1ëĄ ë°ęž¸ě´ 죟ë ę˛(ě ęˇí)ě ë§íŠëë¤. íě§ë§ ě´ëŹí ě°ě°ě 돸ě ę° ěěľëë¤.
biasě ěíĽě´ 돴ě ëŠëë¤.
ë§ě˝ ě°ě°ě í ë¤ě ě ęˇíí기 ěí´ě íęˇ ě 뚟죟ë ę˛˝ě° bias ě ěíĽě´ ěŹëźě§ę˛ ëŠëë¤.(biasë ęł ě ě¤ěšźëź ę°ě´ę¸° ë돸ě íęˇ ě 꾏í´ë ę°ě ę°ě´ ëěľëë¤.)
ëšě íěąě´ ěě´ě§ ě ěěľëë¤.
ë§ě˝ sigmoid뼟 íľęłźíë ę˛˝ě° ëëśëśě ě ë Ľę°ě sigmoidě ě¤ę° ëśëśě ěíŠëë¤. sigmoiděě ě¤ę°ě ě íě´ę¸° ë돸ě ëšě íěąě´ ěŹëźě§ ě ěë¤ë ę˛ě ëë¤.
ě´ëŹí 돸ě 뼟 í´ę˛°í기 ěí´ batch Normalization
ě´ ëěěľëë¤.
: mini-batchě íŹę¸°
: mean
: std
: scale
: shifts
ë íěľ ę°ëĽí íëźëŻ¸í° ě ëë¤. ě´ę˛ě´ ëšě íěąě ěíěí¤ę¸° ěí íëźëŻ¸í° ě ëë¤.
ë°°ěš ě ęˇíë íěľ íë 경ě°ěë 미ë ë°°ěšě íęˇ ęłź ëśě°ě 꾏í ě ěě§ë§ ěśëĄ ě íë 경ě°ë 미ë ë°°ěšę° ě기 ë돸ě íěľ íë ëě ęłě° ë ě´ë íęˇ
ě ěŹěŠ íŠëë¤.
ě´ë íęˇ : ę° ëŻ¸ë ë°°ěš íęˇ ě íęˇ
ě´ë ëśě° : ę° ëŻ¸ë ë°°ěš ëśě°ě íęˇ * m/(m-1) [Besselâs Correction]
CNNě ę˛˝ě° biasě ěí ě ę° ëě í기 ë돸ě bias뼟 ě ęą°íŠëë¤. ęˇ¸ëŚŹęł ěť¨ëłźëŁ¨ě ě°ě°ě íľí´ ěśë Ľëë íšě§ ë§ľěźëĄ ę° ěąëë§ë¤ íęˇ ęłź ëśě°ě ęłě°íęł ëĽź ë§ëëë¤. ěŚ, ěąëě ę°ě ë§íź ę° ě겨ëŠëë¤.
ěĽě
internal covariate shift 돸ě 뼟 í´ę˛°íë¤.
learning rate뼟 íŹę˛ í´ë ëë¤.
ě ě¤íę˛ ě´ę¸°ę°ě ě í íěę° ěë¤.
dropoutě ë체 í ě ěë¤.
forward_batchnorm_layer
void forward_batchnorm_layer(layer l, network net)
{
if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1);
if(net.train){
mean_cpu(l.output, l.batch, l.out_c, l.out_h*l.out_w, l.mean);
variance_cpu(l.output, l.mean, l.batch, l.out_c, l.out_h*l.out_w, l.variance);
scal_cpu(l.out_c, .99, l.rolling_mean, 1);
axpy_cpu(l.out_c, .01, l.mean, 1, l.rolling_mean, 1);
scal_cpu(l.out_c, .99, l.rolling_variance, 1);
axpy_cpu(l.out_c, .01, l.variance, 1, l.rolling_variance, 1);
normalize_cpu(l.output, l.mean, l.variance, l.batch, l.out_c, l.out_h*l.out_w);
copy_cpu(l.outputs*l.batch, l.output, 1, l.x_norm, 1);
} else {
normalize_cpu(l.output, l.rolling_mean, l.rolling_variance, l.batch, l.out_c, l.out_h*l.out_w);
}
scale_bias(l.output, l.scales, l.batch, l.out_c, l.out_h*l.out_w);
add_bias(l.output, l.biases, l.batch, l.out_c, l.out_h*l.out_w);
}
í¨ě ě´ëŚ: forward_batchnorm_layer
ě ë Ľ:
l: layer 꾏쥰체
net: network 꾏쥰체
ëě:
Batch normalization ë ě´ě´ëĽź ěííŠëë¤.
ě¤ëŞ :
ě´ í¨ěë ě ë Ľ ë°ě´í°ě ëí´ Batch normalizationě ěííŠëë¤. ě ë ĽěźëĄë layer 꾏쥰체ě network ęľŹěĄ°ě˛´ę° íěíŠëë¤.
í¨ěë ě ë Ľ ë°ě´í°ëĽź ëłľěŹí í, íěľ ëŞ¨ëě ěśëĄ 모ë뼟 꾏ëśíěŹ ě˛ëŚŹíŠëë¤. íěľ ëŞ¨ëěěë íěŹ ë°°ěšě ëí íęˇ ęłź ëśě°ě ęłě°íęł , ě´ëĽź ěŹěŠíěŹ ě ë Ľ ë°ě´í°ëĽź ě ęˇííŠëë¤. ꡸ ë¤ě, ě ęˇíë ë°ě´í°ě ě¤ěźěźęłź ë°ě´ě´ě¤ëĽź ě ěŠíŠëë¤. ě¤ěźěźęłź ë°ě´ě´ě¤ë layer 꾏쥰체 ë´ě scales ë° biases íëěě ę°ě ¸ěľëë¤.
ë°ëŠ´, ěśëĄ 모ëěěë ë°°ěšě ëí ě´ë íęˇ ęłź ě´ë ëśě°ě ěŹěŠíěŹ ě ë Ľ ë°ě´í°ëĽź ě ęˇííŠëë¤. ě´ë íęˇ ęłź ě´ë ëśě°ě layer 꾏쥰체 ë´ě rolling_mean ë° rolling_variance íëěě ę°ě ¸ěľëë¤.
결곟ě ěźëĄ, Batch normalizationě ě ë Ľ ë°ě´í°ëĽź ě ęˇííěŹ ëŞ¨ë¸ íěľě ěě ííęł , í¨ěŹ ëš ëĽ´ę˛ ěë ´íëëĄ ëěě¤ëë¤.
backward_batchnorm_layer
void backward_batchnorm_layer(layer l, network net)
{
if(!net.train){
l.mean = l.rolling_mean;
l.variance = l.rolling_variance;
}
backward_bias(l.bias_updates, l.delta, l.batch, l.out_c, l.out_w*l.out_h);
backward_scale_cpu(l.x_norm, l.delta, l.batch, l.out_c, l.out_w*l.out_h, l.scale_updates);
scale_bias(l.delta, l.scales, l.batch, l.out_c, l.out_h*l.out_w);
mean_delta_cpu(l.delta, l.variance, l.batch, l.out_c, l.out_w*l.out_h, l.mean_delta);
variance_delta_cpu(l.x, l.delta, l.mean, l.variance, l.batch, l.out_c, l.out_w*l.out_h, l.variance_delta);
normalize_delta_cpu(l.x, l.mean, l.variance, l.mean_delta, l.variance_delta, l.batch, l.out_c, l.out_w*l.out_h, l.delta);
if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, l.delta, 1, net.delta, 1);
}
í¨ě ě´ëŚ: backward_batchnorm_layer
ě ë Ľ:
l: layer 꾏쥰체
net: network 꾏쥰체
ëě:
net.traině´ falseě´ëŠ´ íěŹ ě¸ľě rolling meanęłź rolling varianceëĄ l.meanęłź l.variance뼟 ë체íë¤.
bias ě ë°ě´í¸ě scale ě ë°ě´í¸ëĽź ěííë¤.
delta뼟 scaleëĄ ęłąíęł bias뼟 ëí´ě¤ë¤.
deltaě ëí mean delta뼟 ęłě°íë¤.
deltaě ëí variance delta뼟 ęłě°íë¤.
delta뼟 ě ęˇííë¤.
ë§ě˝ l.typeě´ BATCHNORMě´ëŠ´ delta뼟 net.deltaëĄ ëłľěŹíë¤.
ě¤ëŞ :
ě´ í¨ěë ë°°ěš ě ęˇí 츾ě ěě í(backpropagation)뼟 ěííë¤. ë°°ěš ě ęˇí 츾ě ěě íë ěě í(forward propagation)ěë ë¤ëĽ´ę˛ ěŹëŹ ë¨ęłëĄ 꾏ěąëě´ ěě´ ëłľěĄíë¤. ě´ í¨ěë ě´ëŹí ë¨ęłë¤ě ěííěŹ ěě í뼟 꾏ííë¤.
ě°ě , net.traině´ falseě¸ ę˛˝ě° íěŹ ě¸ľě rolling meanęłź rolling varianceëĄ l.meanęłź l.variance뼟 ë체íë¤. rolling meanęłź rolling varianceë íěŹ mini-batch ě´ě ě 모ë ë°ě´í°ě ěě ęłě°ë íęˇ ęłź ëśě°ě ě ěĽíęł ěë¤. ë°ëźě ě´ě ë°ě´í°ě ě íľęłëě ěŹěŠíěŹ íěŹ mini-batchě ě ęˇí뼟 ěííë¤.
ë¤ěěźëĄ, bias ě ë°ě´í¸ě scale ě ë°ě´í¸ëĽź ěííë¤. ě´ě 츾ěě ě ë°ě´í¸í biasě scaleě ěŹěŠíěŹ íěŹ ě¸ľě biasě scaleě ě ë°ě´í¸íë¤.
꡸ í, delta뼟 scaleëĄ ęłąíęł bias뼟 ëí´ě¤ë¤. ě´ë ěě íěě delta뼟 ě ęˇíí기 ě ě ěíí scaleęłź biasě ě°ě°ě ěě ííë ę˛ě´ë¤.
꡸ ë¤ě, deltaě ëí mean delta뼟 ęłě°íë¤. ě´ë ěě íěě ě ęˇíë ě ë Ľ ę°ě ëí delta뼟 ęłě°í기 ěí´ ěŹěŠí meaně ěě ííë ę˛ě´ë¤.
deltaě ëí variance delta뼟 ęłě°í í, ě´ëĽź ěŹěŠíěŹ delta뼟 ě ęˇííë¤. ě´ë ěě íěě ě ęˇíë ě ë Ľ ę°ě ëí delta뼟 ęłě°í기 ěí´ ěŹěŠí variance뼟 ěě ííë ę˛ě´ë¤.
ë§ě§ë§ěźëĄ, ë§ě˝ l.typeě´ BATCHNORMě¸ ę˛˝ě° delta뼟 net.deltaëĄ ëłľěŹíë¤. ě´ë ě´ě 츾ě deltaě ëí ěě í뼟 ěí ěě ě´ë¤.
make_batchnorm_layer
layer make_batchnorm_layer(int batch, int w, int h, int c)
{
fprintf(stderr, "Batch Normalization Layer: %d x %d x %d image\n", w,h,c);
layer l = {0};
l.type = BATCHNORM;
l.batch = batch;
l.h = l.out_h = h;
l.w = l.out_w = w;
l.c = l.out_c = c;
l.output = calloc(h * w * c * batch, sizeof(float));
l.delta = calloc(h * w * c * batch, sizeof(float));
l.inputs = w*h*c;
l.outputs = l.inputs;
l.scales = calloc(c, sizeof(float));
l.scale_updates = calloc(c, sizeof(float));
l.biases = calloc(c, sizeof(float));
l.bias_updates = calloc(c, sizeof(float));
int i;
for(i = 0; i < c; ++i){
l.scales[i] = 1;
}
l.mean = calloc(c, sizeof(float));
l.variance = calloc(c, sizeof(float));
l.rolling_mean = calloc(c, sizeof(float));
l.rolling_variance = calloc(c, sizeof(float));
l.forward = forward_batchnorm_layer;
l.backward = backward_batchnorm_layer;
return l;
}
í¨ě ě´ëŚ: make_batchnorm_layer
ě ë Ľ:
batch: ë°°ěš íŹę¸°
w: ě´ëŻ¸ě§ ëëš
h: ě´ëŻ¸ě§ ëě´
c: ěąë ě
ëě:
ë°°ěš ě ęˇí ë ě´ě´ëĽź ěěąíęł ě´ę¸°ííŠëë¤.
ë°°ěš ě ęˇíě ě¤ěźěźęłź ë°ě´ě´ě¤ ę°ě 1ęłź 0ěźëĄ ě´ę¸°ííęł , íęˇ ęłź ëśě°, ęˇ¸ëŚŹęł ëĄ¤ë§ íęˇ ęłź ëĄ¤ë§ ëśě° ę°ě 0ěźëĄ ě´ę¸°ííŠëë¤.
ě ë Ľęłź ěśë Ľě íŹę¸°ëĽź ě¤ě íęł , forward_batchnorm_layerě backward_batchnorm_layer í¨ě뼟 ě¤ě íŠëë¤.
ě¤ëŞ :
ě´ í¨ěë ë°°ěš ě ęˇí ë ě´ě´ëĽź ěěąíęł ě´ę¸°ííŠëë¤.
ë°°ěš ě ęˇí ë ě´ě´ë ě¸ęłľ ě 경ë§ěě ě ë Ľę°ě ě ęˇííë ë ě´ě´ëĄ, ě ë Ľę°ě ëśíŹëĽź ěě ííěŹ íěľě ëěą ěě ě ěźëĄ ë§ëëë¤. ě´ í¨ěěěë ë°°ěš ě ęˇí ë ě´ě´ëĽź ěěąíęł íěí ëłěë¤ě ě´ę¸°ííŠëë¤.
ě ë Ľę°ęłź ěśë Ľę°ě íŹę¸°ë ě¸ěëĄ ë°ě ę°ě ë°ëź ě¤ě í늰, ě¤ěźěź, ë°ě´ě´ě¤, íęˇ , ëśě° ëąě ëłěë ě´ę¸°ííŠëë¤. ě´ í¨ěěěë ě´ę¸° ě¤ěźěź ę°ě 1ëĄ, ë°ě´ě´ě¤ ę°ě 0ěźëĄ ě¤ě íŠëë¤.
íęˇ ęłź ëśě°, ëĄ¤ë§ íęˇ ęłź ëĄ¤ë§ ëśě°ě 모ë 0ěźëĄ ě´ę¸°íëŠëë¤.
ě´ í¨ěěěë forward_batchnorm_layerě backward_batchnorm_layer í¨ě뼟 ě¤ě í늰, ě´ í¨ě뼟 íľí´ ěěąë ë°°ěš ě ęˇí ë ě´ě´ë ě¸ęłľ ě ę˛˝ë§ ëŞ¨ë¸ě ęľŹěą ěěëĄ íěŠëŠëë¤.
backward_scale_cpu
void backward_scale_cpu(float *x_norm, float *delta, int batch, int n, int size, float *scale_updates)
{
int i,b,f;
for(f = 0; f < n; ++f){
float sum = 0;
for(b = 0; b < batch; ++b){
for(i = 0; i < size; ++i){
int index = i + size*(f + n*b);
sum += delta[index] * x_norm[index];
}
}
scale_updates[f] += sum;
}
}
í¨ě ě´ëŚ: backward_scale_cpu
ě ë Ľ:
x_norm: normalizationë ě ë Ľę°ě ę°ëŚŹí¤ë íŹě¸í°(float ë°°ě´)
delta: ěśë Ľę°ě ëí ěě¤ě 미ëśę°ě ę°ëŚŹí¤ë íŹě¸í°(float ë°°ě´)
batch: 미ëë°°ěš íŹę¸°(int)
n: íí° ě(int)
size: íí° íŹę¸°(int)
scale_updates: ě¤ěźěź 매ę°ëłěě ě ë°ě´í¸ ę°ě ě ěĽí íŹě¸í°(float ë°°ě´)
ëě:
ě ë Ľę°ě normalizationí í, ěśë Ľę°ě ëí ěě¤ě 미ëśę°ęłź ęłąí 결곟뼟 미ëë°°ěšě íí°, íŹę¸°ëłëĄ íŠíěŹ ě¤ěźěź 매ę°ëłěě ě ë°ě´í¸ ę°ě ęłě°íŠëë¤.
ě¤ëŞ :
Convolutional Neural Networkěě Batch Normalization ęłě¸ľěě ěŹěŠëë í¨ě ě¤ íëëĄ, ě¤ěźěź 매ę°ëłěě ě ë°ě´í¸ ę°ě ęłě°íë í¨ěě ëë¤.
ě¤ěźěź 매ę°ëłěë ě ęˇíë ě ë Ľę°ě ëí´ ęłąí´ě§ë 매ę°ëłěëĄ, ě ë°ě´í¸ë ě´ ë§¤ę°ëłěę° ěě¤ě ě¤ě´ë ë°ŠíĽěźëĄ 쥰ě ëŠëë¤.
ě´ í¨ěë backward propagation ë¨ęłěě í¸ěśë늰, ěśë Ľę°ě ëí ěě¤ě 미ëśę°ęłź normalizationë ě ë Ľę°ě ęłąě 미ëë°°ěšě íí°, íŹę¸°ëłëĄ íŠíěŹ ě¤ěźěź 매ę°ëłěě ě ë°ě´í¸ ę°ě ęłě°íŠëë¤.
mean_delta_cpu
void mean_delta_cpu(float *delta, float *variance, int batch, int filters, int spatial, float *mean_delta)
{
int i,j,k;
for(i = 0; i < filters; ++i){
mean_delta[i] = 0;
for (j = 0; j < batch; ++j) {
for (k = 0; k < spatial; ++k) {
int index = j*filters*spatial + i*spatial + k;
mean_delta[i] += delta[index];
}
}
mean_delta[i] *= (-1./sqrt(variance[i] + .00001f));
}
}
í¨ě ě´ëŚ: mean_delta_cpu
ě ë Ľ:
delta: ě´ě 츾ě ë¸í ę° (float ííě 1ě°¨ě ë°°ě´)
variance: íěŹ ě¸ľě ëśě° ę° (float ííě 1ě°¨ě ë°°ě´)
batch: ë°°ěš ěŹě´ěŚ (int)
filters: íí° ę°ě (int)
spatial: ęłľę° ě°¨ěě íŹę¸° (int)
mean_delta: íěŹ ě¸ľě íęˇ ë¸í ę° (float ííě 1ě°¨ě ë°°ě´)
ëě:
íěŹ ě¸ľě íęˇ ë¸í ę°ě ęłě°íë í¨ě
ę° íí°ëłëĄ ë¸í ę°ě íŠě 꾏íęł , ëśě°ě ě 곹ꡟ ę°ěźëĄ ëëě´ íęˇ ë¸í ę°ě 꾏í¨
ě¤ëŞ :
mean_delta_cpu í¨ěë Batch Normalizationě íěľ ęłźě ě¤ íěŹ ě¸ľě íęˇ ë¸í ę°ě ęłě°íë í¨ěě´ë¤.
ę° íí°ëłëĄ ë¸í ę°ě íŠě 꾏í í, í´ëš íí°ě ëśě° ę°ě ě 곹ꡟěźëĄ ëëě´ íęˇ ë¸í ę°ě ęłě°íë¤.
ě´ë ëśě° ę°ě 0ěźëĄ ëëë ę˛ě ë°Šě§í기 ěí´ ěě ěěę°(.00001f)ě ëí´ě¤ë¤.
ęłě°ë íęˇ ë¸í ę°ě mean_delta ë°°ě´ě ě ěĽëë¤.
variance_delta_cpu
void variance_delta_cpu(float *x, float *delta, float *mean, float *variance, int batch, int filters, int spatial, float *variance_delta)
{
int i,j,k;
for(i = 0; i < filters; ++i){
variance_delta[i] = 0;
for(j = 0; j < batch; ++j){
for(k = 0; k < spatial; ++k){
int index = j*filters*spatial + i*spatial + k;
variance_delta[i] += delta[index]*(x[index] - mean[i]);
}
}
variance_delta[i] *= -.5 * pow(variance[i] + .00001f, (float)(-3./2.));
}
}
í¨ě ě´ëŚ: variance_delta_cpu
ě ë Ľ:
x: íěŹ ě¸ľě ě ë Ľ
delta: íěŹ ě¸ľě ë¸í
mean: íěŹ ě¸ľě íęˇ
variance: íěŹ ě¸ľě ëśě°
batch: ë°°ěš íŹę¸°
filters: íí° ę°ě
spatial: ęłľę° íŹę¸°
variance_delta: ëśě° ë¸í
ëě:
íěŹ ě¸ľě ëśě° ë¸í뼟 ęłě°íë í¨ěě ëë¤.
ě ë ĽěźëĄ íěŹ ě¸ľě ě ë Ľ(x), ë¸í(delta), íęˇ (mean), ëśě°(variance), ë°°ěš íŹę¸°(batch), íí° ę°ě(filters), ęłľę° íŹę¸°(spatial)ę° ěŁźě´ě§ëë¤.
ę° íí°ëłëĄ ëśě° ë¸í뼟 ęłě°í늰, ě´ëĽź ěí´ ę° ë°°ěšěě íěŹ íí°ě ęłľę° ěěšě ë°ëĽ¸ ě¸ëąě¤ëĽź ęłě°íŠëë¤.
ëśě° ë¸íë deltaě (x-mean)ě ęłąě íŠěźëĄ ęłě°ë늰, ě´ ę°ě -(variance+0.00001f)^(3/2)뼟 ęłąí ę°ě ë°ëę°ě ě ěĽíŠëë¤.
ě¤ëŞ :
ë°°ěš ě ęˇí(batch normalization)ěěë ę° ě¸ľěě ě ë Ľ(x)ě ëí íęˇ (mean)ęłź ëśě°(variance)ě ęłě°íŠëë¤.
ęˇ¸ëŚŹęł ëśě° ë¸í(variance delta)ë ě´ě 츾ě ěśë Ľę°ęłź íěŹ ě¸ľě ë¸í뼟 ě´ěŠíěŹ ęłě°ëŠëë¤.
ě´ í¨ěë ëśě° ë¸í뼟 ęłě°í기 ěí í¨ě ě¤ íëëĄ, íěŹ ě¸ľě ě ë Ľ, ë¸í, íęˇ , ëśě°ě ě´ěŠíěŹ ëśě° ë¸í뼟 ęłě°íŠëë¤.
normalize_delta_cpu
void normalize_delta_cpu(float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta)
{
int f, j, k;
for(j = 0; j < batch; ++j){
for(f = 0; f < filters; ++f){
for(k = 0; k < spatial; ++k){
int index = j*filters*spatial + f*spatial + k;
delta[index] = delta[index] * 1./(sqrt(variance[f] + .00001f)) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch);
}
}
}
}
í¨ě ě´ëŚ: normalize_delta_cpu
ě ë Ľ:
float *x: ě ë Ľę° íŹě¸í°
float *mean: íęˇ ę° íŹě¸í°
float *variance: ëśě°ę° íŹě¸í°
float *mean_delta: íęˇ ę° ëłíë íŹě¸í°
float *variance_delta: ëśě°ę° ëłíë íŹě¸í°
int batch: ë°°ěš íŹę¸°
int filters: íí° ę°ě
int spatial: ęłľę° íŹę¸°
float *delta: ë¸íę° íŹě¸í°
ëě:
ě ë Ľę° x, íęˇ ę° mean, ëśě°ę° variance, íęˇ ę° ëłíë mean_delta, ëśě°ę° ëłíë variance_delta, ë°°ěš íŹę¸° batch, íí° ę°ě filters, ęłľę° íŹę¸° spatial, ë¸íę° delta뼟 ë°ěě ë¸íę° delta뼟 ě ęˇí(normalize)íë¤.
ě ęˇí뼟 í기 ěí´ ë¸íę° delta뼟 íęˇ (mean)ęłź ëśě°(variance)ě ě´ěŠíěŹ íě¤í(standardize)íë¤.
ëí, íęˇ ę° ëłíë mean_delta, ëśě°ę° ëłíë variance_delta뼟 ě´ěŠíěŹ íęˇ ęłź ëśě°ě ëłíëě ěśę°ëĄ ë°ěíë¤.
ě¤ëŞ :
ě ë Ľę°ęłź ë¸íę°ě 모ë (batch * filters * spatial) íŹę¸°ě 1ě°¨ě ë°°ě´ëĄ ííëë¤.
ě´ í¨ěë CPUěě ëěí늰, GPUěě ëěíë ë˛ě ë 쥴ěŹíë¤.
ěźë°ě ěźëĄ ëĽëŹëěě ě ë Ľę°ě ě ęˇííë ę˛ě íěľě ěě ěąęłź ěąëĽ íĽěě ë모í기 ěí ë°Šë˛ ě¤ íëě´ë¤.
ě ë Ľę° x뼟 íęˇ meanęłź ëśě° variance뼟 ě´ěŠíěŹ íě¤íí í, ë¸íę° deltaě ë¤ě ęłąí´ě¤ěźëĄě¨ ě ë Ľę°ě ě ęˇííë¤.
íęˇ ę° ëłíë mean_deltaě ëśě°ę° ëłíë variance_deltaë ě´ě ë°°ěšěěě ę°ë¤ě ęł ë ¤íěŹ ěëĄě´ ë°°ěšěěě íęˇ ęłź ëśě°ě´ ě´ëťę˛ ëłííëě§ ěśě í기 ěí ę°ě´ë¤.
Last updated
Was this helpful?