Run an expert MLP.
388{
389
390
391 const GRLMLP& expert =
m_MLPs[isector];
392 vector<float> weights = expert.getWeights();
393 vector<float> bias = expert.getBias();
394 vector<float> layerinput = input;
395
396 vector<float> layeroutput2 = {};
397 vector<float> layeroutput3 = {};
398 vector<float> layeroutput4 = {};
399
401 for (size_t i = 0; i < layerinput.size(); ++i) {
402 layerinput[i] = sim_fix_input_layer_t(layerinput[i]);
403 }
404 layeroutput2.clear();
405 layeroutput2.assign(expert.getNumberOfNodesLayer(2), 0.);
406
407 unsigned num_inputs = layerinput.size();
408 unsigned num_neurons = expert.getNumberOfNodesLayer(2);
409 for (unsigned io = 0; io < num_neurons; ++io) {
410 float bias_raw = bias[io];
411 float bias_fixed = sim_fix_dense_0_bias_t(bias_raw);
412 float bias_contrib = sim_fix_dense_0_accum_t(bias_fixed);
413 layeroutput2[io] = bias_contrib;
414 }
415
416 unsigned iw = 0;
417
418 for (unsigned ii = 0; ii < num_inputs; ++ii) {
419 float input_val = layerinput[ii];
420 for (unsigned io = 0; io < num_neurons; ++io) {
421 float weight_raw = weights[iw];
422 float weight_fixed = sim_fix_dense_0_weight_t(weight_raw);
423 float product = input_val * weight_fixed;
424 float contrib = sim_fix_dense_0_accum_t(product);
425
426 layeroutput2[io] += contrib;
427
428 ++iw;
429 }
430 }
431
432
433
434
435 std::vector<float> layeroutput2_fixed_relu(num_neurons);
436
437 for (unsigned io = 0; io < num_neurons; ++io) {
438
439 float fixed_val = sim_fix_dense_0_t(layeroutput2[io]);
440
441
442 float relu_val = (fixed_val > 0) ? fixed_val : 0;
443
444 layeroutput2_fixed_relu[io] = relu_val;
445
446 }
447
448 std::vector<float> dense1_input(64);
449 for (unsigned i = 0; i < 64; ++i) {
450 dense1_input[i] = sim_dense_1_input_quant(i, layeroutput2_fixed_relu[i]);
451 }
452
453 layeroutput3.clear();
454 layeroutput3.assign(expert.getNumberOfNodesLayer(1), 0.);
455 unsigned num_inputs_1 = layeroutput2_fixed_relu.size();
456 unsigned num_neurons_1 = expert.getNumberOfNodesLayer(2);
457 for (unsigned io = 64; io < num_neurons_1 + 64; ++io) {
458 float bias_raw = bias[io];
459 float bias_fixed = sim_fix_dense_1_bias_t(bias_raw);
460 float bias_contrib = sim_fix_dense_1_accum_t(bias_fixed);
461 layeroutput3[io - 64] = bias_contrib;
462
463 }
464
465
466 for (unsigned ii = 0; ii < num_inputs_1; ++ii) {
467 float input_val = dense1_input[ii];
468 for (unsigned io = 0; io < num_neurons_1; ++io) {
469
470 float weight_raw = weights[iw];
471
472 float weight_fixed = sim_fix_dense_1_weight_t(weight_raw);
473 float product = input_val * weight_fixed;
474 float contrib = sim_fix_dense_1_accum_t(product);
475
476 layeroutput3[io] += contrib;
477 ++iw;
478 }
479 }
480
481
482 std::vector<float> layeroutput3_fixed_relu(num_neurons);
483
484
485 for (unsigned io = 0; io < num_neurons_1; ++io) {
486 float fixed_val = sim_fix_dense_1_t(layeroutput3[io]);
487
488 float relu_val = (fixed_val > 0) ? fixed_val : 0;
489
490 layeroutput3_fixed_relu[io] = relu_val;
491
492 }
493 std::vector<float> dense2_input(64);
494 for (unsigned i = 0; i < 64; ++i) {
495 dense2_input[i] = sim_dense_2_input_quant(i, layeroutput3_fixed_relu[i]);
496 }
497 layeroutput4.clear();
498 layeroutput4.assign(expert.getNumberOfNodesLayer(3), 0.);
499
500 unsigned num_inputs_2 = layeroutput2_fixed_relu.size();
501 unsigned num_neurons_2 = expert.getNumberOfNodesLayer(3);
502 for (unsigned io = 128; io < num_neurons_2 + 128; ++io) {
503 float bias_raw = bias[io];
504 float bias_fixed = sim_fix_dense_2_bias_t(bias_raw);
505 float bias_contrib = sim_fix_dense_2_accum_t(bias_fixed);
506 layeroutput4[io - 128] = bias_contrib;
507
508 }
509
510 for (unsigned ii = 0; ii < num_inputs_2; ++ii) {
511 float input_val = dense2_input[ii];
512 for (unsigned io = 0; io < num_neurons_2; ++io) {
513 float weight_raw = weights[iw];
514 float weight_fixed = sim_fix_dense_2_weight_t(weight_raw);
515 float product = input_val * weight_fixed;
516 float contrib = sim_fix_dense_2_accum_t(product);
517
518 layeroutput4[io] += contrib;
519
520 ++iw;
521 }
522 }
523 return layeroutput4[0];
524
525}