reorg_layer.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "reorg_layer.h"
  2. #include "dark_cuda.h"
  3. #include "blas.h"
  4. #include "utils.h"
  5. #include <stdio.h>
  6. layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse)
  7. {
  8. layer l = { (LAYER_TYPE)0 };
  9. l.type = REORG;
  10. l.batch = batch;
  11. l.stride = stride;
  12. l.h = h;
  13. l.w = w;
  14. l.c = c;
  15. if(reverse){
  16. l.out_w = w*stride;
  17. l.out_h = h*stride;
  18. l.out_c = c/(stride*stride);
  19. }else{
  20. l.out_w = w/stride;
  21. l.out_h = h/stride;
  22. l.out_c = c*(stride*stride);
  23. }
  24. l.reverse = reverse;
  25. fprintf(stderr, "reorg /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c);
  26. l.outputs = l.out_h * l.out_w * l.out_c;
  27. l.inputs = h*w*c;
  28. int output_size = l.out_h * l.out_w * l.out_c * batch;
  29. l.output = (float*)xcalloc(output_size, sizeof(float));
  30. l.delta = (float*)xcalloc(output_size, sizeof(float));
  31. l.forward = forward_reorg_layer;
  32. l.backward = backward_reorg_layer;
  33. #ifdef GPU
  34. l.forward_gpu = forward_reorg_layer_gpu;
  35. l.backward_gpu = backward_reorg_layer_gpu;
  36. l.output_gpu = cuda_make_array(l.output, output_size);
  37. l.delta_gpu = cuda_make_array(l.delta, output_size);
  38. #endif
  39. return l;
  40. }
  41. void resize_reorg_layer(layer *l, int w, int h)
  42. {
  43. int stride = l->stride;
  44. int c = l->c;
  45. l->h = h;
  46. l->w = w;
  47. if(l->reverse){
  48. l->out_w = w*stride;
  49. l->out_h = h*stride;
  50. l->out_c = c/(stride*stride);
  51. }else{
  52. l->out_w = w/stride;
  53. l->out_h = h/stride;
  54. l->out_c = c*(stride*stride);
  55. }
  56. l->outputs = l->out_h * l->out_w * l->out_c;
  57. l->inputs = l->outputs;
  58. int output_size = l->outputs * l->batch;
  59. l->output = (float*)xrealloc(l->output, output_size * sizeof(float));
  60. l->delta = (float*)xrealloc(l->delta, output_size * sizeof(float));
  61. #ifdef GPU
  62. cuda_free(l->output_gpu);
  63. cuda_free(l->delta_gpu);
  64. l->output_gpu = cuda_make_array(l->output, output_size);
  65. l->delta_gpu = cuda_make_array(l->delta, output_size);
  66. #endif
  67. }
  68. void forward_reorg_layer(const layer l, network_state state)
  69. {
  70. if (l.reverse) {
  71. reorg_cpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, l.output);
  72. }
  73. else {
  74. reorg_cpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, l.output);
  75. }
  76. }
  77. void backward_reorg_layer(const layer l, network_state state)
  78. {
  79. if (l.reverse) {
  80. reorg_cpu(l.delta, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, state.delta);
  81. }
  82. else {
  83. reorg_cpu(l.delta, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, state.delta);
  84. }
  85. }
  86. #ifdef GPU
  87. void forward_reorg_layer_gpu(layer l, network_state state)
  88. {
  89. if (l.reverse) {
  90. reorg_ongpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, l.output_gpu);
  91. }
  92. else {
  93. reorg_ongpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, l.output_gpu);
  94. }
  95. }
  96. void backward_reorg_layer_gpu(layer l, network_state state)
  97. {
  98. if (l.reverse) {
  99. reorg_ongpu(l.delta_gpu, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, state.delta);
  100. }
  101. else {
  102. reorg_ongpu(l.delta_gpu, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, state.delta);
  103. }
  104. }
  105. #endif