Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug in dl_lib_matrix3d #106

Open
geekboood opened this issue Aug 9, 2019 · 2 comments
Open

Bug in dl_lib_matrix3d #106

geekboood opened this issue Aug 9, 2019 · 2 comments

Comments

@geekboood
Copy link

@geekboood geekboood commented Aug 9, 2019

Hi, I encounter a bug when I try to use your DL lib. I set a conv kernel of shape (16, 3, 3, 3), which means 16 filters each with 3x3 kernel and 3 channels and an image of shape (1, 14, 14, 3) and the result is different from PyTorch. Code is here.

#include <Arduino.h>
#include <dl_lib.h>
#include <weight.h>


dl_matrix3d_t *ConvBNReLU(dl_matrix3d_t *in, dl_matrix3d_t *filter, dl_matrix3d_t *bnw, dl_matrix3d_t *bnb, int inp, int outp, int kernel, int stride, int padding, int group) {
  dl_matrix3d_t *bias = dl_matrix3d_alloc(1, 1, 1, outp);
  dl_matrix3d_t *result;
  if (group != inp) {
    result = dl_matrix3d_conv(in, filter, bias, stride, stride, padding, 1);
  }
  else {
    result = dl_matrix3d_depthwise_conv(in, filter, stride, stride, padding, 1);
  }
  dl_matrix3d_batch_normalize(result, bnw, bnb);
  dl_matrix3d_relu(result, 6);
  return result;
} 


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(ESP.getFreeHeap());
  dl_matrix3d_t *kernel, *img;
  kernel = dl_matrix3d_alloc(16, 3, 3, 3);
  img = dl_matrix3d_alloc(1, 14, 14, 3);
  // free(kernel->item);
  // free(img->item);
  kernel->item = (fptp_t *)&weight;
  img->item = (fptp_t *)&image;
  dl_matrix3d_t *bias = dl_matrix3d_alloc(1, 1, 1, 16);
  dl_matrix3d_t *result = dl_matrix3d_conv(img, kernel, bias, 2, 2, 1, 1);
  Serial.printf("%d %d %d %d\n", result->n, result->h, result->w, result->c);
  Serial.printf("%f %f %f %f\n", result->item[0], result->item[1], result->item[2], result->item[3]);
  dl_matrix3d_print(result, "");
  
}

void loop() {
  // put your main code here, to run repeatedly:
}

kernel matrix

fptp_t weight[16][3][3][3] = {1., 8., 1., 0., 5., 8., 9., 5., 9., 5., 4., 7., 9., 8., 8., 5., 1.,
       5., 3., 9., 3., 0., 5., 3., 2., 4., 6., 0., 6., 8., 3., 5., 3., 2.,
       9., 6., 4., 7., 5., 5., 8., 2., 2., 1., 4., 5., 6., 5., 7., 5., 4.,
       1., 9., 1., 1., 0., 5., 5., 1., 4., 9., 5., 0., 0., 5., 2., 7., 6.,
       1., 0., 1., 1., 7., 3., 9., 6., 5., 3., 4., 4., 5., 0., 3., 5., 0.,
       5., 8., 2., 4., 6., 5., 7., 1., 1., 6., 5., 9., 2., 8., 1., 4., 1.,
       0., 5., 6., 0., 3., 8., 0., 9., 2., 8., 7., 5., 8., 0., 3., 4., 5.,
       9., 7., 9., 5., 8., 8., 2., 2., 1., 6., 0., 6., 5., 8., 4., 4., 1.,
       4., 7., 4., 6., 9., 0., 0., 0., 2., 7., 5., 3., 1., 7., 3., 9., 3.,
       4., 2., 8., 0., 4., 7., 4., 2., 0., 0., 0., 7., 3., 0., 1., 2., 5.,
       3., 4., 4., 1., 2., 3., 9., 9., 3., 7., 0., 8., 8., 5., 4., 0., 9.,
       6., 0., 2., 6., 3., 4., 2., 4., 1., 2., 6., 9., 4., 7., 7., 8., 1.,
       6., 2., 3., 5., 7., 0., 7., 9., 2., 0., 9., 5., 4., 3., 0., 9., 0.,
       2., 6., 0., 1., 0., 1., 9., 8., 0., 6., 3., 5., 3., 6., 6., 4., 9.,
       7., 2., 1., 8., 7., 8., 7., 3., 3., 0., 6., 3., 9., 2., 1., 1., 2.,
       0., 4., 8., 8., 4., 0., 3., 2., 3., 4., 4., 5., 8., 7., 5., 9., 2.,
       0., 2., 4., 6., 2., 2., 1., 7., 1., 9., 4., 9., 5., 8., 8., 8., 2.,
       3., 9., 2., 5., 0., 5., 7., 1., 5., 7., 1., 7., 2., 8., 3., 4., 4.,
       1., 8., 7., 6., 8., 9., 6., 4., 4., 5., 4., 0., 4., 4., 2., 8., 2.,
       9., 8., 4., 9., 4., 0., 7., 1., 3., 5., 4., 9., 9., 8., 9., 2., 1.,
       7., 9., 2., 7., 5., 9., 6., 6., 6., 6., 6., 9., 9., 3., 6., 1., 5.,
       5., 0., 9., 0., 1., 6., 6., 2., 4., 3., 6., 4., 1., 0., 6., 7., 4.,
       9., 9., 1., 5., 0., 5., 3., 4., 2., 8., 7., 8., 1., 4., 5., 2., 0.,
       1., 4., 1., 5., 4., 1., 3., 1., 7., 6., 7., 5., 7., 7., 0., 5., 0.,
       9., 0., 9., 0., 4., 4., 5., 7., 7., 3., 9., 2., 4., 3., 1., 3., 1.,
       2., 3., 5., 4., 4., 9., 1.};

image matrix

fptp_t image[14][14][3] = {4., 5., 2., 7., 3., 7., 1., 7., 0., 5., 4., 5., 3., 1., 8., 3., 5.,
       9., 2., 3., 0., 4., 9., 8., 8., 3., 4., 7., 1., 5., 7., 1., 2., 4.,
       6., 6., 3., 7., 4., 7., 1., 1., 6., 8., 1., 4., 7., 4., 0., 3., 7.,
       8., 3., 8., 2., 5., 7., 8., 7., 9., 7., 5., 3., 2., 8., 2., 7., 2.,
       7., 8., 8., 0., 5., 9., 6., 6., 2., 6., 6., 7., 2., 0., 0., 7., 9.,
       7., 8., 1., 3., 0., 5., 0., 4., 1., 6., 9., 4., 5., 4., 3., 9., 9.,
       9., 8., 3., 7., 5., 1., 9., 4., 5., 4., 0., 8., 8., 1., 7., 5., 6.,
       9., 4., 7., 4., 5., 2., 2., 5., 8., 5., 6., 6., 8., 6., 8., 2., 9.,
       3., 5., 8., 9., 1., 1., 6., 9., 8., 9., 9., 8., 7., 8., 1., 4., 6.,
       9., 7., 9., 4., 0., 9., 2., 8., 2., 8., 1., 6., 5., 8., 8., 4., 9.,
       8., 1., 9., 9., 9., 2., 7., 3., 5., 9., 2., 3., 6., 8., 7., 5., 4.,
       8., 5., 4., 9., 2., 4., 0., 7., 6., 7., 3., 5., 2., 8., 3., 5., 7.,
       7., 0., 4., 1., 4., 4., 9., 4., 7., 8., 3., 7., 5., 3., 4., 7., 9.,
       0., 6., 4., 6., 6., 6., 6., 4., 3., 7., 8., 4., 9., 5., 3., 6., 7.,
       7., 2., 0., 6., 8., 3., 0., 5., 5., 0., 6., 2., 3., 9., 2., 6., 6.,
       7., 9., 6., 8., 7., 8., 9., 5., 0., 0., 6., 1., 2., 7., 8., 9., 3.,
       1., 7., 0., 2., 6., 4., 6., 3., 6., 2., 9., 7., 5., 6., 0., 8., 3.,
       2., 7., 3., 0., 0., 3., 4., 4., 9., 8., 3., 6., 2., 5., 4., 8., 5.,
       0., 7., 1., 7., 7., 8., 0., 4., 0., 7., 3., 0., 3., 8., 2., 6., 8.,
       2., 3., 0., 7., 5., 4., 6., 4., 8., 3., 0., 9., 7., 4., 9., 0., 2.,
       7., 9., 5., 7., 4., 9., 6., 5., 3., 9., 0., 7., 7., 7., 2., 5., 2.,
       3., 0., 7., 7., 2., 1., 3., 7., 4., 8., 2., 1., 7., 3., 3., 4., 4.,
       1., 3., 1., 5., 4., 9., 1., 9., 4., 4., 2., 1., 4., 7., 7., 0., 1.,
       6., 4., 7., 1., 3., 5., 0., 1., 8., 1., 4., 4., 9., 8., 9., 4., 3.,
       3., 6., 3., 8., 6., 7., 9., 8., 2., 0., 3., 0., 5., 0., 4., 6., 3.,
       0., 7., 2., 0., 9., 0., 1., 2., 7., 6., 1., 8., 1., 4., 4., 0., 5.,
       2., 8., 9., 5., 5., 2., 0., 0., 2., 2., 8., 7., 5., 9., 4., 1., 6.,
       9., 6., 1., 2., 8., 0., 4., 1., 9., 9., 5., 7., 4., 2., 1., 4., 5.,
       1., 6., 9., 9., 4., 8., 6., 5., 8., 8., 0., 8., 5., 3., 5., 7., 2.,
       1., 0., 2., 7., 0., 5., 2., 1., 6., 8., 6., 1., 6., 7., 3., 7., 9.,
       6., 2., 6., 6., 7., 6., 1., 0., 2., 3., 1., 8., 3., 6., 7., 6., 7.,
       7., 7., 6., 0., 9., 3., 2., 5., 8., 1., 2., 5., 7., 3., 1., 2., 8.,
       8., 9., 4., 9., 8., 8., 3., 7., 2., 8., 3., 4., 4., 3., 8., 3., 2.,
       4., 1., 5., 2., 3., 1., 4., 4., 3., 2., 1., 8., 9., 7., 4., 0., 8.,
       6., 4., 1., 3., 2., 3., 3., 1., 6., 9.};

Running the code give me this result.

shape: (1, 7, 7, 16)
===number: 0===
555.000000 526.000000 467.000000 433.000000 538.000000 461.000000 441.000000 477.000000 414.000000 431.000000 525.000000 597.000000 649.000000 427.000000 432.000000 463.000000 
628.000000 499.000000 395.000000 457.000000 658.000000 494.000000 380.000000 506.000000 523.000000 452.000000 509.000000 608.000000 641.000000 615.000000 457.000000 485.000000 
692.000000 641.000000 538.000000 575.000000 759.000000 638.000000 597.000000 633.000000 585.000000 618.000000 675.000000 722.000000 834.000000 616.000000 578.000000 596.000000 
704.000000 602.000000 515.000000 553.000000 687.000000 455.000000 526.000000 635.000000 523.000000 516.000000 627.000000 685.000000 709.000000 529.000000 547.000000 533.000000 
623.000000 528.000000 534.000000 464.000000 726.000000 510.000000 446.000000 584.000000 580.000000 525.000000 659.000000 685.000000 813.000000 680.000000 496.000000 515.000000 
632.000000 626.000000 528.000000 531.000000 686.000000 590.000000 499.000000 599.000000 582.000000 592.000000 642.000000 670.000000 769.000000 619.000000 569.000000 567.000000 
307.000000 335.000000 240.000000 228.000000 312.000000 306.000000 288.000000 323.000000 310.000000 261.000000 252.000000 346.000000 388.000000 286.000000 266.000000 274.000000 

732.000000 617.000000 532.000000 573.000000 789.000000 619.000000 602.000000 633.000000 587.000000 622.000000 677.000000 735.000000 872.000000 724.000000 541.000000 496.000000 
653.000000 576.000000 525.000000 572.000000 671.000000 598.000000 464.000000 573.000000 517.000000 540.000000 602.000000 642.000000 729.000000 576.000000 529.000000 504.000000 
790.000000 733.000000 570.000000 717.000000 806.000000 644.000000 669.000000 688.000000 597.000000 690.000000 763.000000 768.000000 866.000000 656.000000 740.000000 623.000000 
825.000000 672.000000 571.000000 557.000000 800.000000 535.000000 541.000000 711.000000 675.000000 560.000000 694.000000 802.000000 889.000000 699.000000 572.000000 557.000000 
730.000000 567.000000 557.000000 540.000000 689.000000 489.000000 513.000000 592.000000 616.000000 565.000000 648.000000 746.000000 830.000000 721.000000 516.000000 505.000000 
625.000000 571.000000 495.000000 531.000000 668.000000 515.000000 494.000000 539.000000 467.000000 568.000000 665.000000 637.000000 746.000000 623.000000 487.000000 508.000000 
414.000000 377.000000 290.000000 268.000000 455.000000 346.000000 246.000000 405.000000 332.000000 310.000000 395.000000 415.000000 444.000000 358.000000 246.000000 358.000000 

898.000000 750.000000 598.000000 674.000000 869.000000 638.000000 627.000000 777.000000 676.000000 665.000000 727.000000 794.000000 926.000000 782.000000 702.000000 608.000000 
646.000000 669.000000 526.000000 506.000000 592.000000 484.000000 510.000000 677.000000 549.000000 496.000000 687.000000 603.000000 825.000000 555.000000 450.000000 526.000000 
676.000000 620.000000 452.000000 543.000000 700.000000 517.000000 551.000000 582.000000 481.000000 530.000000 580.000000 656.000000 751.000000 587.000000 553.000000 545.000000 
675.000000 573.000000 428.000000 478.000000 672.000000 470.000000 463.000000 592.000000 566.000000 494.000000 556.000000 686.000000 697.000000 613.000000 451.000000 452.000000 
641.000000 618.000000 528.000000 478.000000 683.000000 495.000000 521.000000 603.000000 550.000000 462.000000 634.000000 622.000000 800.000000 601.000000 490.000000 508.000000 
596.000000 524.000000 478.000000 488.000000 551.000000 495.000000 433.000000 486.000000 532.000000 453.000000 470.000000 596.000000 693.000000 564.000000 471.000000 390.000000 
292.000000 252.000000 213.000000 186.000000 274.000000 283.000000 242.000000 238.000000 254.000000 242.000000 355.000000 285.000000 341.000000 261.000000 164.000000 197.000000 

830.000000 735.000000 553.000000 632.000000 783.000000 524.000000 537.000000 715.000000 582.000000 583.000000 594.000000 729.000000 813.000000 642.000000 610.000000 603.000000 
538.000000 670.000000 476.000000 388.000000 613.000000 485.000000 496.000000 639.000000 578.000000 551.000000 596.000000 585.000000 780.000000 562.000000 507.000000 539.000000 
657.000000 555.000000 474.000000 452.000000 600.000000 452.000000 388.000000 529.000000 501.000000 451.000000 425.000000 592.000000 625.000000 471.000000 532.000000 461.000000 
420.000000 371.000000 355.000000 286.000000 473.000000 328.000000 330.000000 357.000000 390.000000 411.000000 395.000000 471.000000 557.000000 532.000000 361.000000 349.000000 
615.000000 589.000000 498.000000 473.000000 603.000000 404.000000 448.000000 523.000000 415.000000 473.000000 499.000000 601.000000 683.000000 526.000000 471.000000 447.000000 
565.000000 508.000000 397.000000 393.000000 593.000000 464.000000 405.000000 555.000000 549.000000 539.000000 571.000000 629.000000 707.000000 636.000000 450.000000 496.000000 
298.000000 345.000000 247.000000 265.000000 304.000000 280.000000 258.000000 307.000000 218.000000 242.000000 256.000000 343.000000 421.000000 236.000000 221.000000 281.000000 

602.000000 536.000000 438.000000 415.000000 580.000000 429.000000 389.000000 479.000000 394.000000 457.000000 484.000000 600.000000 608.000000 511.000000 458.000000 466.000000 
509.000000 568.000000 460.000000 366.000000 548.000000 367.000000 338.000000 545.000000 525.000000 480.000000 488.000000 585.000000 661.000000 490.000000 487.000000 483.000000 
563.000000 494.000000 383.000000 380.000000 576.000000 430.000000 392.000000 484.000000 445.000000 427.000000 463.000000 535.000000 537.000000 451.000000 402.000000 455.000000 
545.000000 424.000000 398.000000 420.000000 577.000000 430.000000 428.000000 470.000000 492.000000 480.000000 493.000000 560.000000 637.000000 566.000000 519.000000 410.000000 
614.000000 484.000000 483.000000 414.000000 614.000000 445.000000 352.000000 506.000000 533.000000 397.000000 552.000000 617.000000 655.000000 479.000000 405.000000 408.000000 
576.000000 511.000000 500.000000 480.000000 690.000000 520.000000 494.000000 529.000000 570.000000 565.000000 618.000000 663.000000 730.000000 644.000000 498.000000 489.000000 
269.000000 340.000000 279.000000 233.000000 301.000000 274.000000 225.000000 366.000000 270.000000 232.000000 313.000000 309.000000 425.000000 281.000000 279.000000 320.000000 

536.000000 456.000000 456.000000 500.000000 606.000000 495.000000 560.000000 440.000000 511.000000 500.000000 521.000000 580.000000 645.000000 545.000000 492.000000 376.000000 
463.000000 482.000000 400.000000 351.000000 516.000000 379.000000 360.000000 521.000000 483.000000 420.000000 491.000000 501.000000 610.000000 514.000000 407.000000 460.000000 
581.000000 533.000000 394.000000 514.000000 638.000000 477.000000 431.000000 484.000000 414.000000 489.000000 519.000000 580.000000 645.000000 501.000000 489.000000 420.000000 
739.000000 653.000000 571.000000 514.000000 759.000000 581.000000 561.000000 615.000000 607.000000 584.000000 680.000000 719.000000 843.000000 671.000000 622.000000 619.000000 
499.000000 536.000000 380.000000 339.000000 445.000000 333.000000 419.000000 522.000000 479.000000 474.000000 427.000000 557.000000 653.000000 499.000000 384.000000 423.000000 
496.000000 458.000000 375.000000 433.000000 493.000000 392.000000 347.000000 458.000000 344.000000 379.000000 372.000000 466.000000 545.000000 430.000000 384.000000 402.000000 
353.000000 422.000000 354.000000 298.000000 435.000000 353.000000 285.000000 424.000000 375.000000 305.000000 341.000000 399.000000 509.000000 396.000000 318.000000 357.000000 

578.000000 450.000000 311.000000 426.000000 589.000000 483.000000 318.000000 419.000000 351.000000 327.000000 438.000000 534.000000 571.000000 443.000000 375.000000 409.000000 
346.000000 309.000000 212.000000 339.000000 417.000000 345.000000 259.000000 311.000000 234.000000 273.000000 358.000000 403.000000 415.000000 306.000000 224.000000 310.000000 
360.000000 268.000000 178.000000 281.000000 289.000000 236.000000 224.000000 271.000000 179.000000 235.000000 267.000000 306.000000 310.000000 241.000000 253.000000 275.000000 
414.000000 363.000000 277.000000 341.000000 407.000000 311.000000 263.000000 286.000000 237.000000 289.000000 328.000000 385.000000 408.000000 312.000000 322.000000 282.000000 
457.000000 368.000000 292.000000 257.000000 507.000000 306.000000 243.000000 362.000000 389.000000 337.000000 462.000000 481.000000 506.000000 423.000000 304.000000 366.000000 
371.000000 274.000000 180.000000 267.000000 382.000000 307.000000 161.000000 264.000000 238.000000 245.000000 303.000000 384.000000 377.000000 323.000000 242.000000 278.000000 
297.000000 228.000000 170.000000 241.000000 334.000000 294.000000 171.000000 217.000000 197.000000 222.000000 278.000000 350.000000 283.000000 218.000000 202.000000 285.000000

The shape is correct but the values are wrong.
PyTorch result

[[[[ 268.,  266.,  213.,  268.,  306.,  169.,  302.,  338.,
           301.,  266.,  332.,  304.,  370.,  255.,  257.,  250.],
         [ 414.,  347.,  292.,  365.,  458.,  307.,  352.,  417.,
           329.,  318.,  443.,  424.,  518.,  342.,  322.,  345.],
         [ 459.,  404.,  379.,  404.,  497.,  427.,  459.,  430.,
           474.,  406.,  505.,  497.,  580.,  438.,  417.,  364.],
         [ 405.,  464.,  376.,  325.,  457.,  395.,  422.,  485.,
           493.,  316.,  535.,  406.,  613.,  369.,  357.,  386.],
         [ 464.,  461.,  338.,  354.,  477.,  356.,  465.,  490.,
           441.,  352.,  458.,  478.,  610.,  388.,  362.,  415.],
         [ 432.,  367.,  319.,  341.,  426.,  320.,  359.,  487.,
           454.,  312.,  415.,  436.,  542.,  374.,  359.,  315.],
         [ 379.,  350.,  325.,  329.,  400.,  275.,  304.,  418.,
           365.,  279.,  381.,  411.,  448.,  286.,  262.,  316.]],

        [[ 503.,  441.,  402.,  366.,  528.,  304.,  350.,  436.,
           443.,  426.,  377.,  516.,  492.,  438.,  437.,  387.],
         [ 646.,  540.,  498.,  471.,  591.,  479.,  515.,  505.,
           520.,  508.,  537.,  597.,  715.,  640.,  536.,  396.],
         [ 775.,  734.,  612.,  622.,  720.,  569.,  545.,  715.,
           695.,  615.,  715.,  767.,  942.,  705.,  641.,  563.],
         [ 774.,  817.,  672.,  621.,  880.,  656.,  658.,  781.,
           716.,  731.,  757.,  841., 1040.,  799.,  681.,  690.],
         [ 770.,  653.,  618.,  570.,  740.,  525.,  578.,  632.,
           608.,  617.,  620.,  741.,  775.,  618.,  636.,  574.],
         [ 763.,  634.,  496.,  519.,  745.,  595.,  507.,  626.,
           671.,  574.,  724.,  673.,  777.,  718.,  532.,  523.],
         [ 612.,  610.,  426.,  501.,  624.,  445.,  483.,  645.,
           553.,  491.,  566.,  646.,  788.,  576.,  472.,  522.]],

        [[ 578.,  492.,  419.,  488.,  603.,  404.,  443.,  456.,
           458.,  484.,  499.,  610.,  648.,  584.,  543.,  436.],
         [ 730.,  720.,  596.,  509.,  790.,  625.,  599.,  626.,
           671.,  566.,  684.,  722.,  869.,  705.,  566.,  556.],
         [ 683.,  662.,  447.,  567.,  696.,  530.,  563.,  675.,
           632.,  620.,  651.,  745.,  826.,  667.,  553.,  548.],
         [ 848.,  776.,  642.,  690.,  900.,  684.,  614.,  723.,
           615.,  671.,  690.,  835.,  922.,  741.,  717.,  674.],
         [ 725.,  691.,  569.,  566.,  710.,  614.,  612.,  590.,
           563.,  669.,  635.,  692.,  812.,  713.,  615.,  526.],
         [ 661.,  582.,  455.,  573.,  590.,  571.,  491.,  559.,
           490.,  585.,  556.,  688.,  790.,  593.,  557.,  486.],
         [ 598.,  525.,  441.,  435.,  588.,  424.,  357.,  494.,
           521.,  475.,  434.,  611.,  654.,  608.,  518.,  480.]],

        [[ 514.,  411.,  368.,  435.,  618.,  393.,  454.,  426.,
           443.,  489.,  503.,  558.,  538.,  520.,  488.,  473.],
         [ 752.,  728.,  611.,  574.,  741.,  560.,  612.,  715.,
           658.,  681.,  687.,  781.,  858.,  595.,  609.,  608.],
         [ 690.,  586.,  457.,  551.,  670.,  453.,  499.,  622.,
           501.,  568.,  642.,  664.,  741.,  580.,  583.,  542.],
         [ 710.,  599.,  516.,  455.,  676.,  482.,  498.,  571.,
           508.,  493.,  577.,  636.,  712.,  594.,  420.,  501.],
         [ 592.,  567.,  475.,  437.,  600.,  456.,  479.,  578.,
           523.,  576.,  570.,  593.,  684.,  534.,  528.,  481.],
         [ 710.,  551.,  423.,  556.,  610.,  459.,  439.,  575.,
           468.,  492.,  560.,  669.,  730.,  575.,  451.,  459.],
         [ 566.,  520.,  411.,  426.,  494.,  380.,  422.,  574.,
           534.,  453.,  489.,  510.,  608.,  472.,  435.,  469.]],

        [[ 476.,  414.,  398.,  377.,  515.,  276.,  378.,  399.,
           362.,  395.,  454.,  474.,  531.,  418.,  454.,  375.],
         [ 691.,  654.,  493.,  506.,  740.,  537.,  536.,  625.,
           567.,  646.,  700.,  746.,  800.,  651.,  514.,  615.],
         [ 728.,  639.,  432.,  580.,  704.,  454.,  494.,  645.,
           423.,  515.,  609.,  648.,  741.,  558.,  507.,  494.],
         [ 491.,  483.,  399.,  378.,  518.,  363.,  396.,  444.,
           370.,  413.,  480.,  524.,  622.,  467.,  391.,  346.],
         [ 558.,  517.,  474.,  385.,  641.,  454.,  394.,  511.,
           534.,  522.,  580.,  567.,  650.,  601.,  500.,  439.],
         [ 660.,  560.,  492.,  488.,  648.,  449.,  449.,  611.,
           553.,  562.,  547.,  688.,  724.,  614.,  515.,  527.],
         [ 557.,  650.,  449.,  445.,  487.,  412.,  459.,  596.,
           455.,  435.,  520.,  492.,  668.,  467.,  437.,  440.]],

        [[ 406.,  262.,  293.,  311.,  431.,  217.,  256.,  300.,
           342.,  305.,  272.,  382.,  289.,  329.,  330.,  213.],
         [ 467.,  484.,  472.,  368.,  495.,  368.,  424.,  461.,
           428.,  498.,  490.,  459.,  586.,  524.,  432.,  375.],
         [ 575.,  451.,  375.,  415.,  595.,  364.,  363.,  539.,
           472.,  511.,  557.,  565.,  586.,  506.,  489.,  429.],
         [ 592.,  564.,  556.,  488.,  582.,  421.,  523.,  570.,
           583.,  486.,  556.,  584.,  755.,  564.,  504.,  450.],
         [ 751.,  592.,  567.,  499.,  695.,  508.,  444.,  607.,
           594.,  517.,  629.,  640.,  725.,  575.,  505.,  489.],
         [ 568.,  477.,  359.,  428.,  505.,  386.,  501.,  420.,
           432.,  495.,  572.,  486.,  544.,  491.,  402.,  338.],
         [ 562.,  553.,  373.,  459.,  661.,  493.,  512.,  612.,
           576.,  558.,  607.,  660.,  713.,  541.,  487.,  506.]],

        [[ 481.,  380.,  297.,  449.,  523.,  343.,  386.,  392.,
           368.,  389.,  421.,  482.,  515.,  500.,  425.,  326.],
         [ 611.,  592.,  535.,  509.,  722.,  632.,  538.,  583.,
           613.,  508.,  647.,  670.,  782.,  582.,  511.,  541.],
         [ 535.,  514.,  383.,  428.,  459.,  316.,  418.,  477.,
           428.,  400.,  436.,  516.,  598.,  476.,  458.,  377.],
         [ 706.,  636.,  440.,  548.,  720.,  543.,  520.,  573.,
           498.,  594.,  663.,  674.,  743.,  640.,  515.,  509.],
         [ 704.,  666.,  456.,  573.,  731.,  527.,  501.,  637.,
           447.,  575.,  606.,  663.,  783.,  628.,  516.,  551.],
         [ 536.,  546.,  430.,  441.,  524.,  411.,  431.,  535.,
           389.,  416.,  501.,  495.,  652.,  416.,  420.,  404.],
         [ 581.,  501.,  379.,  484.,  598.,  383.,  406.,  514.,
           512.,  478.,  516.,  582.,  609.,  520.,  492.,  445.]]]]

However, if I change the image matrix to

fptp_t image[7][7][3] = {4., 0., 4., 1., 4., 7., 2., 0., 9., 4., 7., 2., 6., 0., 4., 0., 0.,
       1., 2., 9., 9., 6., 8., 4., 4., 9., 5., 5., 5., 0., 0., 0., 0., 7.,
       5., 6., 8., 2., 1., 1., 4., 3., 3., 7., 5., 8., 0., 4., 7., 9., 2.,
       3., 0., 7., 2., 1., 1., 4., 7., 3., 4., 4., 2., 5., 3., 1., 9., 6.,
       2., 0., 4., 8., 1., 9., 6., 3., 7., 8., 6., 9., 1., 2., 1., 4., 1.,
       4., 2., 2., 9., 0., 4., 3., 1., 2., 2., 3., 2., 8., 1., 5., 8., 1.,
       9., 2., 5., 4., 5., 1., 9., 5., 9., 3., 6., 1., 1., 4., 2., 9., 9.,
       3., 4., 3., 4., 9., 2., 9., 4., 7., 6., 2., 1., 9., 8., 4., 9., 5.,
       8., 2., 8., 8., 5., 0., 4., 5., 1., 9., 7.};

and with this code

#include <Arduino.h>
#include <dl_lib.h>
#include <weight.h>


dl_matrix3d_t *ConvBNReLU(dl_matrix3d_t *in, dl_matrix3d_t *filter, dl_matrix3d_t *bnw, dl_matrix3d_t *bnb, int inp, int outp, int kernel, int stride, int padding, int group) {
  dl_matrix3d_t *bias = dl_matrix3d_alloc(1, 1, 1, outp);
  dl_matrix3d_t *result;
  if (group != inp) {
    result = dl_matrix3d_conv(in, filter, bias, stride, stride, padding, 1);
  }
  else {
    result = dl_matrix3d_depthwise_conv(in, filter, stride, stride, padding, 1);
  }
  dl_matrix3d_batch_normalize(result, bnw, bnb);
  dl_matrix3d_relu(result, 6);
  return result;
} 


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(ESP.getFreeHeap());
  dl_matrix3d_t *kernel, *img;
  kernel = dl_matrix3d_alloc(16, 3, 3, 3);
  img = dl_matrix3d_alloc(1, 7, 7, 3);
  // free(kernel->item);
  // free(img->item);
  kernel->item = (fptp_t *)&weight;
  img->item = (fptp_t *)&image;
  dl_matrix3d_t *bias = dl_matrix3d_alloc(1, 1, 1, 16);
  dl_matrix3d_t *result = dl_matrix3d_conv(img, kernel, bias, 2, 2, 1, 1);
  Serial.printf("%d %d %d %d\n", result->n, result->h, result->w, result->c);
  Serial.printf("%f %f %f %f\n", result->item[0], result->item[1], result->item[2], result->item[3]);
  dl_matrix3d_print(result, "");
  
}

void loop() {
  // put your main code here, to run repeatedly:
}

it gives me this result

shape: (1, 4, 4, 16)
===number: 0===
238.000000 250.000000 208.000000 228.000000 258.000000 194.000000 266.000000 295.000000 329.000000 252.000000 272.000000 269.000000 366.000000 275.000000 301.000000 219.000000 
330.000000 277.000000 221.000000 223.000000 315.000000 309.000000 340.000000 304.000000 368.000000 236.000000 346.000000 331.000000 379.000000 245.000000 222.000000 216.000000 
226.000000 242.000000 216.000000 180.000000 269.000000 214.000000 240.000000 256.000000 241.000000 208.000000 199.000000 287.000000 357.000000 277.000000 257.000000 231.000000 
243.000000 201.000000 185.000000 157.000000 212.000000 164.000000 158.000000 205.000000 186.000000 176.000000 196.000000 246.000000 210.000000 136.000000 114.000000 175.000000 

453.000000 421.000000 325.000000 375.000000 479.000000 262.000000 416.000000 378.000000 320.000000 438.000000 409.000000 477.000000 420.000000 374.000000 389.000000 390.000000 
580.000000 562.000000 392.000000 453.000000 580.000000 393.000000 364.000000 619.000000 479.000000 419.000000 523.000000 528.000000 646.000000 453.000000 397.000000 463.000000 
519.000000 463.000000 421.000000 373.000000 602.000000 447.000000 440.000000 480.000000 526.000000 425.000000 527.000000 460.000000 579.000000 478.000000 494.000000 456.000000 
341.000000 312.000000 236.000000 237.000000 276.000000 262.000000 192.000000 326.000000 258.000000 222.000000 293.000000 335.000000 412.000000 249.000000 200.000000 244.000000 

348.000000 291.000000 338.000000 266.000000 448.000000 228.000000 298.000000 299.000000 359.000000 383.000000 320.000000 413.000000 387.000000 371.000000 414.000000 295.000000 
554.000000 564.000000 446.000000 434.000000 453.000000 426.000000 386.000000 490.000000 392.000000 470.000000 495.000000 524.000000 630.000000 457.000000 421.000000 428.000000 
596.000000 598.000000 465.000000 484.000000 646.000000 456.000000 434.000000 567.000000 464.000000 546.000000 520.000000 594.000000 676.000000 529.000000 575.000000 496.000000 
405.000000 404.000000 324.000000 281.000000 393.000000 359.000000 248.000000 403.000000 367.000000 326.000000 316.000000 427.000000 526.000000 443.000000 329.000000 338.000000 

416.000000 286.000000 221.000000 293.000000 334.000000 158.000000 250.000000 234.000000 207.000000 204.000000 276.000000 315.000000 289.000000 270.000000 220.000000 208.000000 
439.000000 370.000000 230.000000 308.000000 487.000000 389.000000 314.000000 358.000000 349.000000 373.000000 468.000000 461.000000 510.000000 423.000000 249.000000 289.000000 
467.000000 404.000000 290.000000 347.000000 507.000000 342.000000 265.000000 371.000000 286.000000 239.000000 369.000000 456.000000 461.000000 333.000000 292.000000 374.000000 
302.000000 258.000000 205.000000 234.000000 354.000000 287.000000 177.000000 251.000000 223.000000 252.000000 291.000000 392.000000 363.000000 262.000000 206.000000 338.000000

and PyTorch result is

[[[[238., 250., 208., 228., 258., 194., 266., 295., 329., 252.,
          272., 269., 366., 275., 301., 219.],
         [330., 277., 221., 223., 315., 309., 340., 304., 368., 236.,
          346., 331., 379., 245., 222., 216.],
         [226., 242., 216., 180., 269., 214., 240., 256., 241., 208.,
          199., 287., 357., 277., 257., 231.],
         [243., 201., 185., 157., 212., 164., 158., 205., 186., 176.,
          196., 246., 210., 136., 114., 175.]],

        [[453., 421., 325., 375., 479., 262., 416., 378., 320., 438.,
          409., 477., 420., 374., 389., 390.],
         [580., 562., 392., 453., 580., 393., 364., 619., 479., 419.,
          523., 528., 646., 453., 397., 463.],
         [519., 463., 421., 373., 602., 447., 440., 480., 526., 425.,
          527., 460., 579., 478., 494., 456.],
         [341., 312., 236., 237., 276., 262., 192., 326., 258., 222.,
          293., 335., 412., 249., 200., 244.]],

        [[348., 291., 338., 266., 448., 228., 298., 299., 359., 383.,
          320., 413., 387., 371., 414., 295.],
         [554., 564., 446., 434., 453., 426., 386., 490., 392., 470.,
          495., 524., 630., 457., 421., 428.],
         [596., 598., 465., 484., 646., 456., 434., 567., 464., 546.,
          520., 594., 676., 529., 575., 496.],
         [405., 404., 324., 281., 393., 359., 248., 403., 367., 326.,
          316., 427., 526., 443., 329., 338.]],

        [[416., 286., 221., 293., 334., 158., 250., 234., 207., 204.,
          276., 315., 289., 270., 220., 208.],
         [439., 370., 230., 308., 487., 389., 314., 358., 349., 373.,
          468., 461., 510., 423., 249., 289.],
         [467., 404., 290., 347., 507., 342., 265., 371., 286., 239.,
          369., 456., 461., 333., 292., 374.],
         [302., 258., 205., 234., 354., 287., 177., 251., 223., 252.,
          291., 392., 363., 262., 206., 338.]]]]

IT IS CORRECT!!!!
I was shocked when I encounter this problem!

@XiaochaoGONG

This comment has been minimized.

Copy link
Collaborator

@XiaochaoGONG XiaochaoGONG commented Aug 10, 2019

Hi the different results may be caused by the padding method. In the first case, the output shape is 7x7, which means for input 14x14 and kernel 3x3 stride 2, there should be 1 additional zero padding. So the question is where to add the odd padding, if we add it at the left side, then the result is the same as PyTorch, while if we add it at the right side, the result is what you got. We refer the method of tensorflow here.
The second case needs 2 additional zero padding, which means one at the left side and one at the right side.

@geekboood

This comment has been minimized.

Copy link
Author

@geekboood geekboood commented Aug 10, 2019

@XiaochaoGONG Thanks you for the reply! Now I understand it. However, could you add a support for this different padding strategy, such as a switch variable in the conv function which could be more convenient.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants
You can’t perform that action at this time.