| 156 | // ------------------------------------------------------------------------------------ |
| 157 | |
| 158 | void scale_channels ( |
| 159 | bool add_to, |
| 160 | tensor& dest, |
| 161 | const tensor& src, |
| 162 | const tensor& scales |
| 163 | ) |
| 164 | { |
| 165 | DLIB_CASSERT(have_same_dimensions(dest,src) && |
| 166 | scales.num_samples() == src.num_samples() && |
| 167 | scales.k() == src.k() && |
| 168 | scales.nr() == 1 && |
| 169 | scales.nc() == 1 ); |
| 170 | |
| 171 | if (dest.size() == 0) |
| 172 | return; |
| 173 | |
| 174 | if (add_to) |
| 175 | { |
| 176 | auto d = dest.host(); |
| 177 | auto s = src.host(); |
| 178 | auto scal = scales.host(); |
| 179 | |
| 180 | for (long n = 0; n < src.num_samples(); ++n) |
| 181 | { |
| 182 | for (long k = 0; k < src.k(); ++k) |
| 183 | { |
| 184 | const auto scale = scal[n*scales.k() + k]; |
| 185 | for (long r = 0; r < src.nr(); ++r) |
| 186 | { |
| 187 | for (long c = 0; c < src.nc(); ++c) |
| 188 | { |
| 189 | *d++ += (*s++) * scale; |
| 190 | } |
| 191 | } |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | |
| 196 | } |
| 197 | else |
| 198 | { |
| 199 | auto d = dest.host_write_only(); |
| 200 | auto s = src.host(); |
| 201 | auto scal = scales.host(); |
| 202 | |
| 203 | for (long n = 0; n < src.num_samples(); ++n) |
| 204 | { |
| 205 | for (long k = 0; k < src.k(); ++k) |
| 206 | { |
| 207 | const auto scale = scal[n*scales.k() + k]; |
| 208 | for (long r = 0; r < src.nr(); ++r) |
| 209 | { |
| 210 | for (long c = 0; c < src.nc(); ++c) |
| 211 | { |
| 212 | *d++ = (*s++) * scale; |
| 213 | } |
| 214 | } |
| 215 | } |