30 #include "tiny_dnn/util/util.h"
35 inline void vector_div(vec_t& x, float_t denom) {
36 std::transform(x.begin(), x.end(), x.begin(), [=](float_t x) { return x / denom; });
42 inline void moments(
const tensor_t& in, serial_size_t spatial_dim, serial_size_t channels, vec_t *mean, vec_t *variance) {
43 serial_size_t num_examples =
static_cast<serial_size_t
>(in.size());
45 assert(in[0].size() == spatial_dim * channels);
47 mean->resize(channels);
48 std::fill(mean->begin(), mean->end(), (float_t)0.0);
50 if (variance !=
nullptr) {
51 variance->resize(channels);
52 std::fill(variance->begin(), variance->end(), (float_t)0.0);
56 for (serial_size_t i = 0; i < num_examples; i++) {
57 for (serial_size_t j = 0; j < channels; j++) {
58 float_t* pmean = &mean->at(j);
59 const float_t* X = &in[i][j*spatial_dim];
61 for (serial_size_t k = 0; k < spatial_dim; k++) {
67 vector_div(*mean, (float_t)num_examples*spatial_dim);
70 if (variance !=
nullptr) {
71 for (serial_size_t i = 0; i < num_examples; i++) {
72 for (serial_size_t j = 0; j < channels; j++) {
73 float_t* pvar = &variance->at(j);
74 const float_t* X = &in[i][j*spatial_dim];
75 float_t EX = (*mean)[j];
77 for (serial_size_t k = 0; k < spatial_dim; k++) {
78 *pvar += pow(*X++ - EX, (float_t)2.0);
83 vector_div(*variance, std::max(1.0f, num_examples*spatial_dim-1.0f));