| 1040 | } |
| 1041 | |
| 1042 | void batch_normalize_conv ( |
| 1043 | const double eps, |
| 1044 | resizable_tensor& dest, |
| 1045 | resizable_tensor& means, |
| 1046 | resizable_tensor& invstds, |
| 1047 | const double averaging_factor, |
| 1048 | resizable_tensor& running_means, |
| 1049 | resizable_tensor& running_variances, |
| 1050 | const tensor& src, |
| 1051 | const tensor& gamma, |
| 1052 | const tensor& beta |
| 1053 | ) |
| 1054 | { |
| 1055 | DLIB_CASSERT(0 <= averaging_factor && averaging_factor <= 1, "averaging_factor: " << averaging_factor); |
| 1056 | DLIB_CASSERT(averaging_factor==1 || have_same_dimensions(running_means,means)); |
| 1057 | DLIB_CASSERT(averaging_factor==1 || have_same_dimensions(running_variances,invstds)); |
| 1058 | DLIB_CASSERT( |
| 1059 | src.num_samples() > 1 && |
| 1060 | gamma.num_samples() == 1 && |
| 1061 | beta.num_samples() == 1 && |
| 1062 | gamma.nr() == 1 && |
| 1063 | beta.nr() == 1 && |
| 1064 | gamma.nc() == 1 && |
| 1065 | beta.nc() == 1 && |
| 1066 | gamma.k() == beta.k() && beta.k() == src.k() && |
| 1067 | eps > 0, |
| 1068 | "\ngamma.num_samples(): " << gamma.num_samples() << |
| 1069 | "\ngamma.k(): " << gamma.k() << |
| 1070 | "\ngamma.nr(): " << gamma.nr() << |
| 1071 | "\ngamma.nc(): " << gamma.nc() << |
| 1072 | "\nbeta.num_samples(): " << beta.num_samples() << |
| 1073 | "\nbeta.k(): " << beta.k() << |
| 1074 | "\nbeta.nr(): " << beta.nr() << |
| 1075 | "\nbeta.nc(): " << beta.nc() << |
| 1076 | "\nsrc.k(): " << src.k() << |
| 1077 | "\nsrc.nr(): " << src.nr() << |
| 1078 | "\nsrc.nc(): " << src.nc() << |
| 1079 | "\neps: " << eps |
| 1080 | ); |
| 1081 | |
| 1082 | dest.copy_size(src); |
| 1083 | means.set_size(1, src.k()); |
| 1084 | invstds.set_size(1, src.k()); |
| 1085 | running_means.set_size(1, src.k()); |
| 1086 | running_variances.set_size(1, src.k()); |
| 1087 | |
| 1088 | // first compute means and invstds |
| 1089 | const auto p_invstds = invstds.host(); |
| 1090 | const auto p_means = means.host(); |
| 1091 | const auto p_gamma = gamma.host(); |
| 1092 | const auto p_beta = beta.host(); |
| 1093 | auto p_src = src.host(); |
| 1094 | auto rvar = running_variances.host(); |
| 1095 | const long num = src.nr()*src.nc(); |
| 1096 | |
| 1097 | // This scale makes the running variances unbiased. |
| 1098 | const double scale = (src.num_samples()*num)/(src.num_samples()*num-1.0); |
| 1099 | |