l2norm_layer.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "l2norm_layer.h"
  2. #include "activations.h"
  3. #include "blas.h"
  4. #include "cuda.h"
  5. #include <float.h>
  6. #include <math.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <assert.h>
  10. layer make_l2norm_layer(int batch, int inputs)
  11. {
  12. fprintf(stderr, "l2norm %4d\n", inputs);
  13. layer l = {0};
  14. l.type = L2NORM;
  15. l.batch = batch;
  16. l.inputs = inputs;
  17. l.outputs = inputs;
  18. l.output = calloc(inputs*batch, sizeof(float));
  19. l.scales = calloc(inputs*batch, sizeof(float));
  20. l.delta = calloc(inputs*batch, sizeof(float));
  21. l.forward = forward_l2norm_layer;
  22. l.backward = backward_l2norm_layer;
  23. #ifdef GPU
  24. l.forward_gpu = forward_l2norm_layer_gpu;
  25. l.backward_gpu = backward_l2norm_layer_gpu;
  26. l.output_gpu = cuda_make_array(l.output, inputs*batch);
  27. l.scales_gpu = cuda_make_array(l.output, inputs*batch);
  28. l.delta_gpu = cuda_make_array(l.delta, inputs*batch);
  29. #endif
  30. return l;
  31. }
  32. void forward_l2norm_layer(const layer l, network net)
  33. {
  34. copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
  35. l2normalize_cpu(l.output, l.scales, l.batch, l.out_c, l.out_w*l.out_h);
  36. }
  37. void backward_l2norm_layer(const layer l, network net)
  38. {
  39. //axpy_cpu(l.inputs*l.batch, 1, l.scales, 1, l.delta, 1);
  40. axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1);
  41. }
  42. #ifdef GPU
  43. void forward_l2norm_layer_gpu(const layer l, network net)
  44. {
  45. copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1);
  46. l2normalize_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_w*l.out_h);
  47. }
  48. void backward_l2norm_layer_gpu(const layer l, network net)
  49. {
  50. axpy_gpu(l.batch*l.inputs, 1, l.scales_gpu, 1, l.delta_gpu, 1);
  51. axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1);
  52. }
  53. #endif