asgn
 
Loading...
Searching...
No Matches
dcnnsol.hpp
1#ifndef dcnnsol_hpp_
2#define dcnnsol_hpp_
3
4#include "dcnncombined.hpp"
5
6namespace dcnnsol {
7
8 using dcnnasgn::permutation_policy_tag;
9
10 using dcnnasgn::kernel_height_selector;
11 using dcnnasgn::kernel_width_selector;
12 using dcnnasgn::channel_selector;
13 using dcnnasgn::batch_tag;
14 using dcnnasgn::height_selector;
15 using dcnnasgn::width_selector;
16 using dcnnasgn::conv_weight_policy;
17 using dcnnasgn::feature_weight_policy;
19 using dcnnasgn::first_normalize_layer_base;
20 using dcnnasgn::nonstrided_conv_layer_base;
21 using dcnnasgn::strided_conv_layer_base;
22 using dcnnasgn::image_normalize_layer_base;
23 using dcnnasgn::image_multiply_layer_base;
24 using dcnnasgn::image_shift_layer_base;
25 using dcnnasgn::image_relu_layer_base;
26 using dcnnasgn::image_maxpool_layer_base;
27 using dcnnasgn::final_maxpool_layer_base;
28 using dcnnasgn::feature_conv_layer_base;
29 using dcnnasgn::feature_shift_layer_base;
30 using dcnnasgn::loss_layer_base;
31 using dcnnasgn::gold_data;
32 using dcnnasgn::image_data_policy;
33 using dcnnasgn::feature_data_policy;
34 using dcnnasgn::feature_multiplier_policy;
35 using dcnnasgn::feature_bias_policy;
36
37 using tagged::tag_list;
38 using tagged::co;
39 using tagged::tensor_class;
40
48
76
77
91
98 template< typename SP>
99 class image_data<SP, permutation_policy> {
100 public:
102 image_data(const batch_range& nr)
104 {}
109 };
110
120 template< typename CSP>
121 class feature_data< CSP, permutation_policy> {
122 public:
124 feature_data(const batch_range& nr) : values(policy::cr& nr) {}
129 };
130
139 template< typename KSP, typename CSPI, typename CSPO>
140 class conv_weights< KSP, CSPI, CSPO, permutation_policy> {
141 public:
147
148 conv_weights()
149 : weights(policy::khr& policy::kwr & ~policy::cir& policy::cor)
150 {}
151 };
152
160 template< typename CSPI, typename CSPO>
161 class feature_weights< CSPI, CSPO, permutation_policy> {
162 public:
168
169 feature_weights()
170 : weights(~policy::cir& policy::cor)
171 {
172 }
173 };
174
181 template< typename CSP>
182 class feature_multiplier< CSP, permutation_policy> {
183 public:
185 feature_multiplier() : multipliers(policy::cr) {}
186 policy::multiplier_t multipliers;
187 };
188
195 template< typename CSP>
196 class feature_bias< CSP, permutation_policy> {
197 public:
199 feature_bias() : betas(policy::cr) {}
200 policy::bias_t betas;
201 };
202
203
213
220 template< typename SP>
221 struct first_normalize_layer< SP, permutation_policy>
222 : first_normalize_layer_base< SP, permutation_policy>
223 {
224 private:
226
227 using typename base_::input_data;
228 using typename base_::stat_data;
229 using typename base_::output_data;
230
231 using base_::hr;
232 using base_::wr;
233 using base_::cr;
234
236 public:
243 static void forward(const input_data& ind, stat_data& cd, output_data& outd)
244 {
245 auto br = forward_check(ind, cd, outd);
246
247 auto&& inv = ind.images;
248 auto&& sumx = cd.sumx;
249 auto&& sumx2 = cd.sumx2;
250 auto&& E = cd.E;
251 auto&& var = cd.var;
252 auto&& scale = cd.scale;
253 auto&& outv = outd.values;
254
255 sumx = 0;
256 sumx2 = 0;
257
258 for (auto h : hr)
259 {
260 for (auto w : wr)
261 {
262 for (auto b : br)
263 {
264 for (auto c : cr)
265 {
266 float value = inv[b & h & w & c];
267 sumx += value;
268 sumx2 += value * value;
269 }
270 }
271 }
272 }
273
274 std::uint64_t n = hr.size() * wr.size() * br.size() * cr.size();
275 E = (float)((double)sumx / n);
276 var = (float)(((double)sumx2 - (double)sumx * E) / n);
277 scale = 1.0f / std::sqrt(var);
278
279 for (auto h : hr)
280 {
281 for (auto w : wr)
282 {
283 for (auto b : br)
284 {
285 for (auto c : cr)
286 {
287 outv[h & w & c & b] = scale * (inv[b & h & w & c] - E);
288 }
289 }
290 }
291 }
292 }
293 };
294
303 template< typename SPI, typename SPO, typename KSP>
304 struct nonstrided_conv_layer<SPI, SPO, KSP, permutation_policy>
305 : nonstrided_conv_layer_base< SPI, SPO, KSP, permutation_policy>
306 {
307 private:
309
310 using typename base_::input_data;
311 using typename base_::weights;
312 using typename base_::output_data;
313
314 using base_::hokrf;
315 using base_::hokimf;
316 using base_::wokrf;
317 using base_::wokimf;
318
319 using base_::hikrf;
320 using base_::hikomf;
321 using base_::wikrf;
322 using base_::wikomf;
323
324 using base_::hkorf;
325 using base_::hkoimf;
326 using base_::wkorf;
327 using base_::wkoimf;
328
329 using base_::hir;
330 using base_::wir;
331 using base_::cir;
332 using base_::khr;
333 using base_::kwr;
334 using base_::hor;
335 using base_::wor;
336 using base_::cor;
337
338 using base_::fanin;
339
341
342 public:
343 static void load_model(weights& wtd, const std::filesystem::path& data_folder, const std::string& fname)
344 {
345 auto&& weights = wtd.weights;
346
347 load_data_raw<dcnnasgn::image_conv_ftl>(weights, data_folder / (fname + ".bin"));
348 }
349
356 static void forward(const input_data& ind, const weights& wtd, output_data& outd)
357 {
358 auto br = forward_check(ind, wtd, outd);
359
360 auto&& inv = ind.values;
361 auto&& wtv = wtd.weights;
362 auto&& outv = outd.values;
363
364 for (auto x : outv.range())
365 {
366 outv[x] = 0.0f;
367 }
368
369 for (auto b : br)
370 {
371 auto&& outvb = outv[b];
372 auto&& invb = inv[b];
373
374 for (auto kh : khr)
375 {
376 auto hor2 = hkorf(kh);
377 auto hoid = hkoimf(kh);
378
379 for (auto kw : kwr)
380 {
381 auto wor2 = wkorf(kw);
382 auto woid = wkoimf(kw);
383
384 auto&& wtvk = wtv[kh & kw];
385
386 for (auto ho : hor2)
387 {
388 auto hi = hoid(ho);
389
390 auto&& outvbh = outvb[ho];
391 auto&& invbh = invb[hi];
392
393 for (auto wo : wor2)
394 {
395 auto wi = woid(wo);
396
397 auto&& outvbhw = outvbh[wo];
398 auto&& invbhw = invbh[wi];
399
400 for (auto ci : cir)
401 {
402 auto&& wtwki = wtvk[~ci];
403
404 float val_inv = invbhw[ci];
405 for (auto co : cor)
406 {
407 outvbhw[co] += wtwki[co] * val_inv;
408 }
409 }
410 }
411 }
412 }
413 }
414 }
415 }
416 };
417
426 template< typename SPI, typename SPO, typename KSP>
427 struct strided_conv_layer<SPI, SPO, KSP, permutation_policy>
428 : strided_conv_layer_base< SPI, SPO, KSP, permutation_policy>
429 {
430 private:
432
433 using typename base_::input_data;
434 using typename base_::weights;
435 using typename base_::output_data;
436
437 using base_::hokrf;
438 using base_::hokimf;
439 using base_::wokrf;
440 using base_::wokimf;
441
442 using base_::hikrf;
443 using base_::hikomf;
444 using base_::wikrf;
445 using base_::wikomf;
446
447 using base_::hkorf;
448 using base_::hkoimf;
449 using base_::wkorf;
450 using base_::wkoimf;
451
452 using base_::hir;
453 using base_::wir;
454 using base_::cir;
455 using base_::khr;
456 using base_::kwr;
457 using base_::hor;
458 using base_::wor;
459 using base_::cor;
460
461 using base_::fanin;
462
464
465 public:
466 static void load_model(weights& wtd, const std::filesystem::path& data_folder, const std::string& fname)
467 {
468 auto&& weights = wtd.weights;
469
470 load_data_raw<dcnnasgn::image_conv_ftl>(weights, data_folder / (fname + ".bin"));
471 }
472
479 static void forward(const input_data& ind, const weights& wtd, output_data& outd)
480 {
481 auto br = forward_check(ind, wtd, outd);
482
483 auto&& inv = ind.values;
484 auto&& wtv = wtd.weights;
485 auto&& outv = outd.values;
486
487 for (auto x : outv.range())
488 {
489 outv[x] = 0.0f;
490 }
491
492 for (auto b : br)
493 {
494 auto&& outvb = outv[b];
495 auto&& invb = inv[b];
496
497 for (auto kh : khr)
498 {
499 auto hor2 = hkorf(kh);
500 auto hoid = hkoimf(kh);
501
502 for (auto kw : kwr)
503 {
504 auto wor2 = wkorf(kw);
505 auto woid = wkoimf(kw);
506
507 auto&& wtvk = wtv[kh & kw];
508
509 for (auto ho : hor2)
510 {
511 auto hi = hoid(ho);
512
513 auto&& outvbh = outvb[ho];
514 auto&& invbh = invb[hi];
515
516 for (auto wo : wor2)
517 {
518 auto wi = woid(wo);
519
520 auto&& outvbhw = outvbh[wo];
521 auto&& invbhw = invbh[wi];
522
523 for (auto ci : cir)
524 {
525 auto&& wtwki = wtvk[~ci];
526
527 float val_inv = invbhw[ci];
528 for (auto co : cor)
529 {
530 outvbhw[co] += wtwki[co] * val_inv;
531 }
532 }
533 }
534 }
535 }
536 }
537 }
538 }
539 };
540
547 template< typename SP>
548 struct image_normalize_layer< SP, permutation_policy>
549 : image_normalize_layer_base<SP, permutation_policy>
550 {
551 private:
553
554 using typename self_::input_data;
555 using typename self_::norm_data;
556 using typename self_::output_data;
557
558 using typename self_::channel_tag;
559
560 using self_::hr;
561 using self_::wr;
562 using self_::cr;
563
564 using self_::forward_check;
565
566 public:
567
568 static void load_model(norm_data& nd, const std::filesystem::path& data_folder, const std::string& fname_mean, const std::string& fname_var)
569 {
570 load_data_raw<dcnnasgn::feature_ftl>(nd.Es, data_folder / (fname_mean + ".bin"));
571
572 auto&& scalev = nd.scales;
574 load_data_raw<dcnnasgn::feature_ftl>(vars, data_folder / (fname_var + ".bin"));
575 for (auto c : cr)
576 {
577 auto var = vars[c];
578 scalev[c] = 1.0f / std::sqrt(var);
579 }
580 }
581
588 static void forward(const input_data& ind, const norm_data& nd, output_data& outd)
589 {
590 auto br = forward_check(ind, nd, outd);
591
592 auto&& inv = ind.values;
593 auto&& Ev = nd.Es;
594 auto&& scalev = nd.scales;
595 auto&& outv = outd.values;
596
597 forward_core(br, inv, Ev, scalev, outv);
598 }
599
600 static void forward_core(auto br, auto&& inv, auto&& Ev, auto&& scalev, auto&& outv)
601 {
602 for (auto b : br)
603 {
604 auto&& invb = inv[b];
605 auto&& outvb = outv[b];
606 for (auto h : hr)
607 {
608 auto&& invbh = invb[h];
609 auto&& outvbh = outvb[h];
610 for (auto w : wr)
611 {
612 auto&& invbhw = invbh[w];
613 auto&& outvbhw = outvbh[w];
614 for (auto c : cr)
615 {
616 outvbhw[c] = scalev[c] * (invbhw[c] - Ev[c]);
617 }
618 }
619 }
620 }
621 }
622
623
624 };
625
632 template< typename SP>
633 struct image_multiply_layer< SP, permutation_policy>
634 : image_multiply_layer_base< SP, permutation_policy>
635 {
636 private:
638
639 using typename base_::input_data;
640 using typename base_::multiplier_data;
641 using typename base_::output_data;
642
643 using base_::hr;
644 using base_::wr;
645 using base_::cr;
646
648
649 public:
650 static void load_model(multiplier_data& cd, const std::filesystem::path& data_folder, const std::string& fname)
651 {
652 load_data_raw<dcnnasgn::feature_ftl>(cd.multipliers, data_folder / (fname + ".bin"));
653 }
654
661 static void forward(const input_data& ind, const multiplier_data& cd, output_data& outd)
662 {
663 auto br = forward_check(ind, cd, outd);
664
665 auto&& inv = ind.values;
666 auto&& multiplierv = cd.multipliers;
667 auto&& outv = outd.values;
668
669 for (auto b : br)
670 {
671 auto&& invb = inv[b];
672 auto&& outvb = outv[b];
673 for (auto h : hr)
674 {
675 auto&& invbh = invb[h];
676 auto&& outvbh = outvb[h];
677 for (auto w : wr)
678 {
679 auto&& invbhw = invbh[w];
680 auto&& outvbhw = outvbh[w];
681 for (auto c : cr)
682 {
683 outvbhw[c] = invbhw[c] * multiplierv[c];
684 }
685 }
686 }
687 }
688 }
689 };
690
697 template< typename SP>
698 struct image_shift_layer< SP, permutation_policy>
699 : image_shift_layer_base< SP, permutation_policy>
700 {
701 private:
703
704 using typename base_::input_data;
705 using typename base_::bias_data;
706 using typename base_::output_data;
707
708 using base_::hr;
709 using base_::wr;
710 using base_::cr;
711
713
714 public:
715 static void load_model(bias_data& cd, const std::filesystem::path& data_folder, const std::string& fname)
716 {
717 load_data_raw<dcnnasgn::feature_ftl>(cd.betas, data_folder / (fname + ".bin"));
718 }
719
726 static void forward(const input_data& ind, const bias_data& cd, output_data& outd)
727 {
728 auto br = forward_check(ind, cd, outd);
729
730 auto&& inv = ind.values;
731 auto&& betav = cd.betas;
732 auto&& outv = outd.values;
733
734 for (auto b : br)
735 {
736 auto&& invb = inv[b];
737 auto&& outvb = outv[b];
738 for (auto h : hr)
739 {
740 auto&& invbh = invb[h];
741 auto&& outvbh = outvb[h];
742 for (auto w : wr)
743 {
744 auto&& invbhw = invbh[w];
745 auto&& outvbhw = outvbh[w];
746 for (auto c : cr)
747 {
748 outvbhw[c] = invbhw[c] + betav[c];
749 }
750 }
751 }
752 }
753 }
754 };
755
760 template< typename SP>
761 struct image_relu_layer< SP, permutation_policy>
762 : image_relu_layer_base< SP, permutation_policy>
763 {
764 private:
766
767 using typename base_::input_data;
768 using typename base_::output_data;
769
770 using base_::hr;
771 using base_::wr;
772 using base_::cr;
773
774 using base_::forward_check;
775
776 public:
782 static void forward(const input_data& ind, output_data& outd)
783 {
784 auto br = forward_check(ind, outd);
785
786 auto&& inv = ind.values;
787 auto&& outv = outd.values;
788
789 for (auto b : br)
790 {
791 auto&& invb = inv[b];
792 auto&& outvb = outv[b];
793 for (auto h : hr)
794 {
795 auto&& invbh = invb[h];
796 auto&& outvbh = outvb[h];
797 for (auto w : wr)
798 {
799 auto&& invbhw = invbh[w];
800 auto&& outvbhw = outvbh[w];
801 for (auto c : cr)
802 {
803 outvbhw[c] = std::max(0.0f, invbhw[c]);
804 }
805 }
806 }
807 }
808 }
809 };
810
816 template< typename SPI, typename SPO>
817 struct image_maxpool_layer< SPI, SPO, permutation_policy>
818 : image_maxpool_layer_base<SPI, SPO, permutation_policy>
819 {
820 private:
822
823 using typename base_::input_data;
824 using typename base_::output_data;
825
826 using typename base_::height_out_tag;
827 using typename base_::width_out_tag;
828 using typename base_::channel_tag;
829
830 using base_::hir;
831 using base_::wir;
832 using base_::cr;
833
834 using base_::khr;
835 using base_::kwr;
836
837 using base_::hor;
838 using base_::wor;
839
840 using base_::hkoimf;
841 using base_::wkoimf;
842
843 using base_::forward_check;
844 public:
850 static void forward(const input_data& ind, output_data& outd)
851 {
852 auto br = forward_check(ind, outd);
853
854 auto&& inv = ind.values;
855 auto&& outv = outd.values;
856
857 for (auto b : br)
858 {
859 auto&& outvb = outv[b];
860 for (auto ho : hor)
861 {
862 auto&& outvbh = outvb[ho];
863 for (auto wo : wor)
864 {
865 auto&& outvbhw = outvbh[wo];
866 for (auto c : cr)
867 {
868 outvbhw[c] = -std::numeric_limits<float>::infinity();
869 }
870 }
871 }
872 }
873
874 for (auto b : br)
875 {
876 auto&& invb = inv[b];
877 auto&& outvb = outv[b];
878 for (auto kh : khr)
879 {
880 auto hoid = hkoimf(kh);
881 for (auto kw : kwr)
882 {
883 auto woid = wkoimf(kw);
884 for (auto ho : hor)
885 {
886 auto&& outvbh = outvb[ho];
887 auto hi = hoid(ho);
888 auto&& invbh = invb[hi];
889 for (auto wo : wor)
890 {
891 auto&& outvbhw = outvbh[wo];
892 auto wi = woid(wo);
893 auto&& invbhw = invbh[wi];
894 for (auto c : cr)
895 {
896 outvbhw[c] = std::max(outvbhw[c], invbhw[c]);
897 }
898 }
899 }
900 }
901 }
902 }
903 }
904 };
905
911 template< typename SPI, typename CSPO>
912 struct final_maxpool_layer< SPI, CSPO, permutation_policy>
913 : final_maxpool_layer_base<SPI, CSPO, permutation_policy>
914 {
915 private:
917
918 using typename base_::input_data;
919 using typename base_::output_data;
920
921 using typename base_::height_in_tag;
922 using typename base_::width_in_tag;
923 using typename base_::channel_tag;
924
925 using base_::hir;
926 using base_::wir;
927 using base_::cr;
928
930 public:
936 static void forward(const input_data& ind, output_data& outd)
937 {
938 auto br = forward_check(ind, outd);
939
940 auto&& inv = ind.values;
941 auto&& outv = outd.values;
942
943 for (auto b : br)
944 {
945 auto&& outvb = outv[b];
946 for (auto c : cr)
947 {
948 outvb[c] = -std::numeric_limits<float>::infinity();
949 }
950 }
951
952 for (auto b : br)
953 {
954 auto&& invb = inv[b];
955 auto&& outvb = outv[b];
956 for (auto hi : hir)
957 {
958 auto&& invbh = invb[hi];
959 for (auto wi : wir)
960 {
961 auto&& invbhw = invbh[wi];
962 for (auto c : cr)
963 {
964 outvb[c] = std::max(outvb[c], invbhw[c]);
965 }
966 }
967 }
968 }
969 }
970 };
971
980 template< typename CSPI, typename CSPO>
981 struct feature_conv_layer< CSPI, CSPO, permutation_policy>
982 : feature_conv_layer_base< CSPI, CSPO, permutation_policy>
983 {
984 private:
986
987 using typename base_::input_data;
988 using typename base_::weights;
989 using typename base_::output_data;
990
991 using base_::cir;
992 using base_::cor;
993
995
996 using base_::fanin;
997 public:
998
999 static void load_model(weights& wtd, const std::filesystem::path& data_folder, const std::string& fname)
1000 {
1001 auto&& weights = wtd.weights;
1002
1003 load_data_raw<dcnnasgn::feature_conv_ftl>(weights, data_folder / (fname + ".bin"));
1004 }
1005
1012 static void forward(const input_data& ind, const weights& wtd, output_data& outd)
1013 {
1014 auto br = forward_check(ind, wtd, outd);
1015
1016 auto&& inv = ind.values;
1017 auto&& wtv = wtd.weights;
1018 auto&& outv = outd.values;
1019
1020 for (auto co : cor)
1021 {
1022 for (auto b : br)
1023 {
1024 outv[co & b] = 0.0f;
1025 }
1026 }
1027
1028 for (auto ci : cir)
1029 {
1030 for (auto co : cor)
1031 {
1032 auto wt = wtv[~ci & co];
1033 for (auto b : br)
1034 {
1035 outv[co & b] += wt * inv[ci & b];
1036 }
1037 }
1038 }
1039 }
1040 };
1041
1048 template< typename CSP>
1049 struct feature_shift_layer< CSP, permutation_policy>
1050 : feature_shift_layer_base< CSP, permutation_policy>
1051 {
1052 private:
1054
1055 using typename base_::input_data;
1056 using typename base_::bias_data;
1057 using typename base_::output_data;
1058
1059 using base_::cr;
1060
1061 using base_::forward_check;
1062 public:
1063
1064 static void load_model(bias_data& cd, const std::filesystem::path& data_folder, const std::string& fname)
1065 {
1066 load_data_raw<dcnnasgn::feature_ftl>(cd.betas, data_folder / (fname + ".bin"));
1067 }
1068
1075 static void forward(const input_data& ind, const bias_data& cd, output_data& outd)
1076 {
1077 auto br = forward_check(ind, cd, outd);
1078
1079 auto&& inv = ind.values;
1080 auto&& betav = cd.betas;
1081 auto&& outv = outd.values;
1082
1083 for (auto c : cr)
1084 {
1085 auto beta = betav[c];
1086 for (auto b : br)
1087 {
1088 outv[c & b] = inv[c & b] + beta;
1089 }
1090 }
1091 }
1092 };
1093
1100 template< typename CSP>
1101 struct loss_layer< CSP, permutation_policy>
1102 : loss_layer_base< CSP, permutation_policy>
1103 {
1104 private:
1106
1107 using typename base_::input_data;
1108 using typename base_::output_data;
1109
1110 using base_::cr;
1111
1112 using base_::forward_check;
1113 public:
1120 static void forward(const input_data& ind, const gold_data& gd, output_data& outd)
1121 {
1122 auto br = forward_check(ind, gd, outd);
1123
1124 auto&& inv = ind.values;
1125 auto&& labelv = gd.labels;
1126 auto&& outv = outd.loss;
1127
1128 for (auto b : br)
1129 {
1130 auto label = labelv[b];
1131 float loss = 0.0f;
1132 for (auto c : cr)
1133 {
1134 auto value = inv[c & b];
1135 auto expected = c.value() == label ? 1.0f : 0.0f;
1136 auto diff = value - expected;
1137 loss += diff * diff;
1138 }
1139 outv[b] = loss;
1140 }
1141 }
1142 };
1143
1144
1148
1152 template< typename CSPI, typename CSPO, typename KSP>
1153 class complete_cnn_model< CSPI, CSPO, KSP, permutation_policy> {
1154 public:
1155 using model_c = dcnnsol::conv_weights< KSP, CSPI, CSPO, permutation_policy>;
1156 using model_b = dcnnsol::feature_bias< CSPO, permutation_policy>;
1157 using model_n = dcnnasgn::image_normalize_model< CSPO>;
1158 using model_m = dcnnsol::feature_multiplier< CSPO, permutation_policy>;
1159 using model_s = dcnnsol::feature_bias< CSPO, permutation_policy>;
1160
1161 model_c c;
1162 model_b b;
1163 model_n n;
1164 model_m m;
1165 model_s s;
1166 };
1167
1171 template< typename SPI, typename SPO>
1172 struct complete_cnn_internal< SPI, SPO, permutation_policy> {
1173 private:
1174 using CSPI = typename SPI::channel_policy;
1175 using CSPO = typename SPO::channel_policy;
1176 public:
1177 using data_c = dcnnsol::image_data< SPO, permutation_policy>;
1178 using data_b = dcnnsol::image_data< SPO, permutation_policy>;
1179 using data_n = dcnnsol::image_data< SPO, permutation_policy>;
1180 using data_m = dcnnsol::image_data< SPO, permutation_policy>;
1181 using data_s = dcnnsol::image_data< SPO, permutation_policy>;
1182
1183 data_c c;
1184 data_b b;
1185 data_n n;
1186 data_m m;
1187 data_s s;
1188
1189 complete_cnn_internal(const batch_range& nr)
1190 : c(nr), b(nr), n(nr), m(nr), s(nr)
1191 {
1192 }
1193 };
1194
1200 template< typename SPI, typename SPO, typename KSP>
1201 struct complete_cnn_layer< SPI, SPO, KSP, permutation_policy> {
1202 public:
1203 using CSPI = typename SPI::channel_policy;
1204 using CSPO = typename SPO::channel_policy;
1205
1206 static constexpr bool nonstrided = tagged::same_tag< typename SPI::height_tag, typename SPO::height_tag>
1207 && tagged::same_tag< typename SPI::width_tag, typename SPO::width_tag>;
1208
1209 using layer_c = std::conditional_t< nonstrided,
1210 dcnnsol::nonstrided_conv_layer< SPI, SPO, KSP, permutation_policy>,
1211 dcnnsol::strided_conv_layer< SPI, SPO, KSP, permutation_policy>>;
1212 using layer_b = dcnnsol::image_shift_layer< SPO, permutation_policy>;
1213 using layer_n = dcnnsol::image_normalize_layer< SPO, permutation_policy>;
1214 using layer_m = dcnnsol::image_multiply_layer< SPO, permutation_policy>;
1215 using layer_s = dcnnsol::image_shift_layer< SPO, permutation_policy>;
1216 using layer_r = dcnnsol::image_relu_layer< SPO, permutation_policy>;
1217
1218 using internal_data = complete_cnn_internal< SPI, SPO, permutation_policy>;
1219
1220 using input_data = dcnnsol::image_data< SPI, permutation_policy>;
1221 using model = complete_cnn_model< CSPI, CSPO, KSP, permutation_policy>;
1222 using output_data = dcnnsol::image_data< SPO, permutation_policy>;
1223
1224 static void load_model(model& md, const std::filesystem::path& data_folder, int feature_number)
1225 {
1226 auto conv_name = "features." + std::to_string(feature_number);
1227 auto norm_name = "features." + std::to_string(feature_number + 1);
1228
1229 layer_c::load_model(md.c, data_folder, conv_name + ".weight");
1230 layer_b::load_model(md.b, data_folder, conv_name + ".bias");
1231 layer_n::load_model(md.n, data_folder, norm_name + ".running_mean", norm_name + ".running_var");
1232 layer_m::load_model(md.m, data_folder, norm_name + ".weight");
1233 layer_s::load_model(md.s, data_folder, norm_name + ".bias");
1234 }
1235
1236 static void forward(const input_data& ind, const model& md, internal_data& td, output_data& outd)
1237 {
1238 layer_c::forward(ind, md.c, td.c);
1239 layer_b::forward(td.c, md.b, td.b);
1240 layer_n::forward(td.b, md.n, td.n);
1241 layer_m::forward(td.n, md.m, td.m);
1242 layer_s::forward(td.m, md.s, td.s);
1243 layer_r::forward(td.s, outd);
1244 }
1245
1247 static std::size_t forward_complexity(const batch_range& br)
1248 {
1249 std::size_t s = 0;
1250 s += layer_c::forward_complexity(br);
1251 s += layer_b::forward_complexity(br);
1252 s += layer_n::forward_complexity(br);
1253 s += layer_m::forward_complexity(br);
1254 s += layer_s::forward_complexity(br);
1255 s += layer_r::forward_complexity(br);
1256 return s;
1257 }
1259 };
1260
1262
1263}
1264
1265#endif
policy::weights_t weights
Convolution or Aggregate layer weights.
Definition dcnnsol.hpp:146
policy::values_t values
Activation signals for all images in a minibatch.
Definition dcnnsol.hpp:128
policy::weights_t weights
Convolution or Aggregate layer weights.
Definition dcnnsol.hpp:167
policy::values_t values
Activation signals for all images in a minibatch.
Definition dcnnsol.hpp:108
A tensor - a multi-dimensional tagged generalization of vector/matrix.
Definition tagged.hpp:1365
tagged::range_class< batch_tag > batch_range
The range of images within a minibatch.
Definition dcnnelements.hpp:83
retag< typename impl::co_traits< selector< T > >::co, T > co
Provide a co-tag for a given tag.
Definition tagged.hpp:1645
Tag: Channel dimension.
Definition dcnnelements.hpp:149
Policy class: Model weight data types for convolutional layers.
Definition dcnnelements.hpp:786
tagged::permute_tensor_class< typename PP::weights, float, kernel_height_tag, kernel_width_tag, tagged::co< channel_in_tag >, channel_out_tag > weights_t
The tensor containing the weights of the convolution.
Definition dcnnelements.hpp:811
Definition dcnnelements.hpp:1566
Utility base class for the fully connected layer.
Definition dcnnelements.hpp:1962
dcnnsol::feature_weights< CSPI, CSPO, PP > weights
Model weights.
Definition dcnnelements.hpp:1974
static constexpr std::size_t fanin
Number of inputs for each output element.
Definition dcnnelements.hpp:2002
static constexpr auto cor
Output feature channel range.
Definition dcnnelements.hpp:1998
dcnnsol::feature_data< CSPI, PP > input_data
Input activations.
Definition dcnnelements.hpp:1970
static constexpr auto cir
Input feature channel range.
Definition dcnnelements.hpp:1997
static tagged::range_class< batch_tag > forward_check(const input_data &ind, const weights &wtd, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:2014
dcnnsol::feature_data< CSPO, PP > output_data
Output activations.
Definition dcnnelements.hpp:1978
Final layer activation data policy.
Definition dcnnelements.hpp:418
static constexpr auto cr
Channel index range, statically sized.
Definition dcnnelements.hpp:424
tagged::permute_tensor_class< typename PP::feature_data, float, channel_tag, batch_tag > values_t
2-dimensional tensor type carrying activations
Definition dcnnelements.hpp:431
Definition dcnnelements.hpp:1453
Definition dcnnelements.hpp:2047
Policy class: Model weight data types for fully connected layers.
Definition dcnnelements.hpp:824
tagged::permute_tensor_class< typename PP::feature_weights, float, tagged::co< channel_in_tag >, channel_out_tag > weights_t
The tensor containing the weights of the convolution.
Definition dcnnelements.hpp:847
Definition dcnnelements.hpp:1825
static constexpr auto cr
Input image channel range.
Definition dcnnelements.hpp:1862
dcnnsol::feature_data< CSPO, PP > output_data
Output activations.
Definition dcnnelements.hpp:1841
static tagged::range_class< batch_tag > forward_check(const input_data &ind, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:1878
typename SPI::width_tag width_in_tag
Input image width.
Definition dcnnelements.hpp:1849
typename SPI::height_tag height_in_tag
Input image height.
Definition dcnnelements.hpp:1848
static constexpr auto hir
Input image height range.
Definition dcnnelements.hpp:1860
typename SPI::channel_tag channel_tag
Input image channel.
Definition dcnnelements.hpp:1850
static constexpr auto wir
Input image width range.
Definition dcnnelements.hpp:1861
dcnnsol::image_data< SPI, PP > input_data
Input activations.
Definition dcnnelements.hpp:1837
Utility base class for the first normalizing layer.
Definition dcnnelements.hpp:588
static tagged::range_class< batch_tag > forward_check(const input_data &ind, stat_data &cd, output_data &outd)
Argument compatibility check for the forward function.
Definition dcnnelements.hpp:626
static constexpr auto hr
Index range along image height.
Definition dcnnelements.hpp:621
dcnnsol::image_data< SP, PP > output_data
Output activations.
Definition dcnnelements.hpp:604
static constexpr auto cr
Output channel index range [0,1)
Definition dcnnelements.hpp:623
first_stat stat_data
Statistics.
Definition dcnnelements.hpp:600
static constexpr auto wr
Index range along image width.
Definition dcnnelements.hpp:622
batch_data< ISP, CSP > input_data
Input activations.
Definition dcnnelements.hpp:596
Internal layer activation data policy.
Definition dcnnelements.hpp:369
tagged::permute_tensor_class< typename PP::data, float, height_tag, width_tag, channel_tag, batch_tag > values_t
4-dimensional tensor type carrying activations
Definition dcnnelements.hpp:401
static constexpr auto cr
Channel index range, statically sized.
Definition dcnnelements.hpp:394
static constexpr auto hr
Image height range, statically sized.
Definition dcnnelements.hpp:386
static constexpr auto wr
Image width range, statically sized.
Definition dcnnelements.hpp:390
Definition dcnnelements.hpp:1755
Utility base class for the image multiply layer.
Definition dcnnelements.hpp:1474
dcnnsol::image_data< SP, PP > output_data
Output activations.
Definition dcnnelements.hpp:1491
static constexpr auto hr
Image height range.
Definition dcnnelements.hpp:1508
static constexpr auto wr
Image width range.
Definition dcnnelements.hpp:1509
dcnnsol::feature_multiplier< CSP, PP > multiplier_data
Model multiplieres.
Definition dcnnelements.hpp:1487
dcnnsol::image_data< SP, PP > input_data
Input activations.
Definition dcnnelements.hpp:1483
static tagged::range_class< batch_tag > forward_check(const input_data &ind, const multiplier_data &cd, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:1524
static constexpr auto cr
Image channel range.
Definition dcnnelements.hpp:1510
Utility base class for a normalizing layer.
Definition dcnnelements.hpp:1373
image_normalize_model< CSP > norm_data
Statistics.
Definition dcnnelements.hpp:1384
static constexpr auto cr
Index range along image width.
Definition dcnnelements.hpp:1405
static constexpr auto hr
Index range along image height.
Definition dcnnelements.hpp:1403
dcnnsol::image_data< SP, PP > output_data
Output activations.
Definition dcnnelements.hpp:1388
typename SP::channel_tag channel_tag
Tag: Channel index.
Definition dcnnelements.hpp:1401
dcnnsol::image_data< SP, PP > input_data
Input activations.
Definition dcnnelements.hpp:1380
static constexpr auto wr
Index range along image width.
Definition dcnnelements.hpp:1404
Definition dcnnelements.hpp:1674
Utility base class for the image shift layer.
Definition dcnnelements.hpp:1587
static constexpr auto hr
Image height range.
Definition dcnnelements.hpp:1622
dcnnsol::image_data< SP, PP > output_data
Output activations.
Definition dcnnelements.hpp:1605
static constexpr auto cr
Image channel range.
Definition dcnnelements.hpp:1624
static tagged::range_class< batch_tag > forward_check(const input_data &ind, const bias_data &cd, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:1638
static constexpr auto wr
Image width range.
Definition dcnnelements.hpp:1623
dcnnsol::feature_bias< CSP, PP > bias_data
Model biases.
Definition dcnnelements.hpp:1601
dcnnsol::image_data< SP, PP > input_data
Input activations.
Definition dcnnelements.hpp:1597
Definition dcnnelements.hpp:2089
Utility base class for the convolutional layer.
Definition dcnnelements.hpp:998
static constexpr conv_iko_map_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, khr.size(), 1 > hikomf
input-height index to kernel-height index to output-height index
Definition dcnnelements.hpp:1093
static constexpr conv_ok_range_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, hir.size(), khr.size(), 1 > hokrf
output-height index to kernel-height range
Definition dcnnelements.hpp:1087
dcnnsol::image_data< SPI, PP > input_data
Input activations.
Definition dcnnelements.hpp:1009
static constexpr auto cor
Output image channel range.
Definition dcnnelements.hpp:1052
static constexpr auto hir
Input image height range.
Definition dcnnelements.hpp:1045
static constexpr auto wir
Input image width range.
Definition dcnnelements.hpp:1046
static constexpr conv_koi_map_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, tagged::selector< width_in_tag >, kwr.size(), 1 > wkoimf
kernel-width index to output-width index to input-width index
Definition dcnnelements.hpp:1100
static constexpr conv_koi_map_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, tagged::selector< height_in_tag >, khr.size(), 1 > hkoimf
kernel-height index to output-height index to input-height index
Definition dcnnelements.hpp:1098
static constexpr auto cir
Input image channel range.
Definition dcnnelements.hpp:1047
static constexpr auto khr
Kernel height range.
Definition dcnnelements.hpp:1048
dcnnsol::image_data< SPO, PP > output_data
Output activations.
Definition dcnnelements.hpp:1017
static tagged::range_class< batch_tag > forward_check(const input_data &ind, const weights &wtd, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:1114
static constexpr conv_ko_range_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, hir.size(), khr.size(), 1 > hkorf
kernel-height index to output-height range
Definition dcnnelements.hpp:1097
static constexpr conv_oki_map_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, kwr.size(), 1 > wokimf
output-width index to kernel-width index to input-width index
Definition dcnnelements.hpp:1090
static constexpr conv_ik_range_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, wir.size(), kwr.size(), 1 > wikrf
input-width index to kernel-width range
Definition dcnnelements.hpp:1094
static constexpr conv_ko_range_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, wir.size(), kwr.size(), 1 > wkorf
kernel-width index to output-width range
Definition dcnnelements.hpp:1099
static constexpr conv_oki_map_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, khr.size(), 1 > hokimf
output-height index to kernel-height index to input-height index
Definition dcnnelements.hpp:1088
static constexpr auto kwr
Kernel width range.
Definition dcnnelements.hpp:1049
static constexpr conv_iko_map_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, kwr.size(), 1 > wikomf
input-width index to kernel-width index to output-width index
Definition dcnnelements.hpp:1095
static constexpr std::size_t fanin
Number of inputs for each output element.
Definition dcnnelements.hpp:1056
dcnnsol::conv_weights< KSP, CSPI, CSPO, PP > weights
Model weights.
Definition dcnnelements.hpp:1013
static constexpr conv_ok_range_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, wir.size(), kwr.size(), 1 > wokrf
output-width index to kernel-width range
Definition dcnnelements.hpp:1089
static constexpr auto hor
Output image height range.
Definition dcnnelements.hpp:1050
static constexpr conv_ik_range_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, hir.size(), khr.size(), 1 > hikrf
input-height index to kernel-height range
Definition dcnnelements.hpp:1092
static constexpr auto wor
Output image width range.
Definition dcnnelements.hpp:1051
Utility base class for the convolutional layer.
Definition dcnnelements.hpp:1162
static constexpr conv_iko_map_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, kwr.size(), WSTRIDE > wikomf
input-width index to kernel-width index to output-width index
Definition dcnnelements.hpp:1269
static tagged::range_class< batch_tag > forward_check(const input_data &ind, const weights &wtd, output_data &outd)
Check argument compatibility for the forward function.
Definition dcnnelements.hpp:1288
static constexpr conv_oki_map_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, khr.size(), HSTRIDE > hokimf
output-height index to kernel-height index to input-height index
Definition dcnnelements.hpp:1262
dcnnsol::image_data< SPI, PP > input_data
Input activations.
Definition dcnnelements.hpp:1173
static constexpr auto wor
Output image width range.
Definition dcnnelements.hpp:1212
static constexpr conv_oki_map_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, kwr.size(), WSTRIDE > wokimf
output-width index to kernel-width index to input-width index
Definition dcnnelements.hpp:1264
static constexpr conv_koi_map_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, tagged::selector< height_in_tag >, khr.size(), HSTRIDE > hkoimf
kernel-height index to output-height index to input-height index
Definition dcnnelements.hpp:1272
static constexpr conv_ko_range_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, wir.size(), kwr.size(), WSTRIDE > wkorf
kernel-width index to output-width range
Definition dcnnelements.hpp:1273
static constexpr conv_ik_range_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, hir.size(), khr.size(), HSTRIDE > hikrf
input-height index to kernel-height range
Definition dcnnelements.hpp:1266
static constexpr auto hor
Output image height range.
Definition dcnnelements.hpp:1211
dcnnsol::image_data< SPO, PP > output_data
Output activations.
Definition dcnnelements.hpp:1181
static constexpr auto wir
Input image width range.
Definition dcnnelements.hpp:1207
static constexpr auto hir
Input image height range.
Definition dcnnelements.hpp:1206
static constexpr conv_ko_range_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, hir.size(), khr.size(), HSTRIDE > hkorf
kernel-height index to output-height range
Definition dcnnelements.hpp:1271
static constexpr auto kwr
Kernel width range.
Definition dcnnelements.hpp:1210
static constexpr auto khr
Kernel height range.
Definition dcnnelements.hpp:1209
static constexpr auto cor
Output image channel range.
Definition dcnnelements.hpp:1213
static constexpr conv_koi_map_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, tagged::selector< width_in_tag >, kwr.size(), WSTRIDE > wkoimf
kernel-width index to output-width index to input-width index
Definition dcnnelements.hpp:1274
static constexpr auto cir
Input image channel range.
Definition dcnnelements.hpp:1208
static constexpr conv_ik_range_functor< tagged::selector< width_in_tag >, tagged::selector< kernel_width_tag >, wir.size(), kwr.size(), WSTRIDE > wikrf
input-width index to kernel-width range
Definition dcnnelements.hpp:1268
static constexpr conv_ok_range_functor< tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, hir.size(), khr.size(), HSTRIDE > hokrf
output-height index to kernel-height range
Definition dcnnelements.hpp:1261
dcnnsol::conv_weights< KSP, CSPI, CSPO, PP > weights
Model weights.
Definition dcnnelements.hpp:1177
static constexpr conv_iko_map_functor< tagged::selector< height_in_tag >, tagged::selector< kernel_height_tag >, tagged::selector< height_out_tag >, khr.size(), HSTRIDE > hikomf
input-height index to kernel-height index to output-height index
Definition dcnnelements.hpp:1267
static constexpr std::size_t fanin
Number of inputs for each output element.
Definition dcnnelements.hpp:1217
static constexpr conv_ok_range_functor< tagged::selector< kernel_width_tag >, tagged::selector< width_out_tag >, wir.size(), kwr.size(), WSTRIDE > wokrf
output-width index to kernel-width range
Definition dcnnelements.hpp:1263
static void forward(const input_data &ind, const weights &wtd, output_data &outd)
The forward-propagation function of an aggregate layer.
Definition dcnnsol.hpp:1012
static void forward(const input_data &ind, const bias_data &cd, output_data &outd)
The forward-propagation function of a linear layer.
Definition dcnnsol.hpp:1075
static void forward(const input_data &ind, output_data &outd)
The forward-propagation function of a MaxPool layer.
Definition dcnnsol.hpp:936
static void forward(const input_data &ind, stat_data &cd, output_data &outd)
The forward-propagation function of the first Normalizing layer.
Definition dcnnsol.hpp:243
static void forward(const input_data &ind, output_data &outd)
The forward-propagation function of a MaxPool layer.
Definition dcnnsol.hpp:850
static void forward(const input_data &ind, const multiplier_data &cd, output_data &outd)
The forward-propagation function of a linear layer.
Definition dcnnsol.hpp:661
static void forward(const input_data &ind, const norm_data &nd, output_data &outd)
The forward-propagation function of a normalizing layer.
Definition dcnnsol.hpp:588
static void forward(const input_data &ind, output_data &outd)
The forward-propagation function of a ReLU layer.
Definition dcnnsol.hpp:782
static void forward(const input_data &ind, const bias_data &cd, output_data &outd)
The forward-propagation function of a linear layer.
Definition dcnnsol.hpp:726
static void forward(const input_data &ind, const gold_data &gd, output_data &outd)
The forward-propagation function of the loss layer.
Definition dcnnsol.hpp:1120
static void forward(const input_data &ind, const weights &wtd, output_data &outd)
The forward-propagation function of a convolutional layer.
Definition dcnnsol.hpp:356
Policy class defining the layout of all major data.
Definition dcnnsol.hpp:55
tagged::tag_list< batch_tag, channel_selector > feature_data
The index order for activation signals (feature_data::values) generated by the Aggregate layer.
Definition dcnnsol.hpp:74
tagged::tag_list< tagged::co< channel_selector >, channel_selector > feature_weights
The index order for fully connected layer weights (conv_weights::weights)
Definition dcnnsol.hpp:65
tagged::tag_list< kernel_height_selector, kernel_width_selector, tagged::co< channel_selector >, channel_selector > weights
The index order for Convolution and Aggregate layer weights (conv_weights::weights)
Definition dcnnsol.hpp:60
tagged::tag_list< batch_tag, height_selector, width_selector, channel_selector > data
The index order for forward activation signals (image_data::values) between all layers except the fir...
Definition dcnnsol.hpp:70
static void forward(const input_data &ind, const weights &wtd, output_data &outd)
The forward-propagation function of a convolutional layer.
Definition dcnnsol.hpp:479
A wrapped list of tags.
Definition tagged.hpp:182