| | |
| | | #include "blas.h" |
| | | #include "math.h" |
| | | |
| | | void shortcut_cpu(float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2) |
| | | { |
| | | int i,j,k,b; |
| | | for(b = 0; b < batch; ++b){ |
| | | for(k = 0; k < c && k < c2; ++k){ |
| | | for(j = 0; j < h/sample; ++j){ |
| | | for(i = 0; i < w/sample; ++i){ |
| | | int out_index = i*sample + w*(j*sample + h*(k + c*b)); |
| | | int add_index = b*w*stride/sample*h*stride/sample*c2 + i*stride + w*stride/sample*(j*stride + h*stride/sample*k); |
| | | out[out_index] += add[add_index]; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | void mean_cpu(float *x, int batch, int filters, int spatial, float *mean) |
| | | { |
| | | float scale = 1./(batch * spatial); |
| | | int i,j,k; |
| | | for(i = 0; i < filters; ++i){ |
| | | mean[i] = 0; |
| | | for(j = 0; j < batch; ++j){ |
| | | for(k = 0; k < spatial; ++k){ |
| | | int index = j*filters*spatial + i*spatial + k; |
| | | mean[i] += x[index]; |
| | | } |
| | | } |
| | | mean[i] *= scale; |
| | | } |
| | | } |
| | | |
| | | void variance_cpu(float *x, float *mean, int batch, int filters, int spatial, float *variance) |
| | | { |
| | | float scale = 1./(batch * spatial); |
| | | int i,j,k; |
| | | for(i = 0; i < filters; ++i){ |
| | | variance[i] = 0; |
| | | for(j = 0; j < batch; ++j){ |
| | | for(k = 0; k < spatial; ++k){ |
| | | int index = j*filters*spatial + i*spatial + k; |
| | | variance[i] += pow((x[index] - mean[i]), 2); |
| | | } |
| | | } |
| | | variance[i] *= scale; |
| | | } |
| | | } |
| | | |
| | | void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial) |
| | | { |
| | | int b, f, i; |
| | | for(b = 0; b < batch; ++b){ |
| | | for(f = 0; f < filters; ++f){ |
| | | for(i = 0; i < spatial; ++i){ |
| | | int index = b*filters*spatial + f*spatial + i; |
| | | x[index] = (x[index] - mean[f])/(sqrt(variance[f])); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | void const_cpu(int N, float ALPHA, float *X, int INCX) |
| | | { |
| | | int i; |
| | |
| | | for(i = 0; i < N; ++i) X[i*INCX] *= ALPHA; |
| | | } |
| | | |
| | | void fill_cpu(int N, float ALPHA, float *X, int INCX) |
| | | { |
| | | int i; |
| | | for(i = 0; i < N; ++i) X[i*INCX] = ALPHA; |
| | | } |
| | | |
| | | void copy_cpu(int N, float *X, int INCX, float *Y, int INCY) |
| | | { |
| | | int i; |