AIチップをmbedから駆動するためのプログラムです.

Dependencies:   mbed

Committer:
toriten1024
Date:
Sat Mar 16 14:54:57 2019 +0000
Revision:
1:18e8ead6f188
Parent:
0:80ae2acaa6a1
mbed_fest 2019 spring Nagoya ; Neural Network demo code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
toriten1024 0:80ae2acaa6a1 1 #include "mbed.h"
toriten1024 1:18e8ead6f188 2 #include "fixed18.hpp"
toriten1024 1:18e8ead6f188 3 #include "weight.hpp"
toriten1024 1:18e8ead6f188 4 #include "matrix.hpp"
toriten1024 1:18e8ead6f188 5 #include "Activation.hpp"
toriten1024 0:80ae2acaa6a1 6
toriten1024 0:80ae2acaa6a1 7 DigitalOut myled(LED1);
toriten1024 1:18e8ead6f188 8 DigitalOut myled2(LED2);
toriten1024 1:18e8ead6f188 9
toriten1024 1:18e8ead6f188 10
toriten1024 1:18e8ead6f188 11 Serial pc(USBTX, USBRX); // tx, rx
toriten1024 0:80ae2acaa6a1 12
toriten1024 0:80ae2acaa6a1 13 DigitalOut CLK(p23);
toriten1024 0:80ae2acaa6a1 14 DigitalOut RST(p24);
toriten1024 0:80ae2acaa6a1 15
toriten1024 0:80ae2acaa6a1 16 BusInOut High9(p5,p6,p7,p8,p9,p10,p11,p12,p13);
toriten1024 0:80ae2acaa6a1 17 BusInOut Low9(p14,p15,p16,p17,p18,p19,p20,p21,p22);
toriten1024 0:80ae2acaa6a1 18
toriten1024 0:80ae2acaa6a1 19
toriten1024 1:18e8ead6f188 20
toriten1024 0:80ae2acaa6a1 21 int main() {
toriten1024 1:18e8ead6f188 22
toriten1024 1:18e8ead6f188 23
toriten1024 1:18e8ead6f188 24
toriten1024 1:18e8ead6f188 25 mat::Matrix<Fix18> x(784, 1);
toriten1024 1:18e8ead6f188 26 printf("hello\n");
toriten1024 1:18e8ead6f188 27 while(1){
toriten1024 1:18e8ead6f188 28
toriten1024 1:18e8ead6f188 29
toriten1024 1:18e8ead6f188 30
toriten1024 1:18e8ead6f188 31 /*
toriten1024 1:18e8ead6f188 32 const unsigned int data[] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 122, 14, 0, 0, 0, 0, 0, 0, 68, 122, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 300, 368, 68, 0, 0, 0, 0, 0, 0, 218, 368, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 190, 436, 300, 40, 0, 0, 0, 0, 0, 0, 244, 408, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 394, 394, 94, 0, 0, 0, 0, 0, 0, 0, 244, 408, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 312, 436, 190, 14, 0, 0, 0, 0, 0, 0, 14, 272, 326, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 462, 300, 40, 0, 0, 0, 0, 0, 0, 0, 68, 380, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 340, 422, 108, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 312, 462, 300, 40, 0, 0, 0, 0, 0, 0, 0, 0, 108, 408, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 244, 462, 312, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 408, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 422, 340, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 326, 326, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 490, 368, 244, 218, 108, 82, 82, 82, 82, 82, 82, 82, 150, 422, 286, 82, 82, 82, 82, 82, 68, 14, 0, 0, 0, 0, 0, 150, 380, 408, 408, 394, 382, 408, 408, 408, 408, 408, 408, 408, 422, 476, 450, 408, 408, 408, 408, 408, 380, 272, 244, 244, 0, 0, 0, 14, 68, 82, 82, 82, 162, 244, 244, 244, 244, 244, 244, 244, 286, 436, 340, 244, 244, 244, 244, 244, 244, 326, 408, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 382, 108, 0, 0, 0, 0, 0, 0, 40, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 272, 380, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 380, 272, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 408, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
toriten1024 1:18e8ead6f188 33
toriten1024 1:18e8ead6f188 34 for (int i = 0; i < x.width * x.height; i++)
toriten1024 1:18e8ead6f188 35 {
toriten1024 1:18e8ead6f188 36 x.data[i].value = data[i];
toriten1024 1:18e8ead6f188 37 }
toriten1024 1:18e8ead6f188 38 */
toriten1024 1:18e8ead6f188 39
toriten1024 1:18e8ead6f188 40
toriten1024 1:18e8ead6f188 41 int flag = 0;
toriten1024 1:18e8ead6f188 42
toriten1024 1:18e8ead6f188 43 for (int i = 0; i < x.width * x.height; i++)
toriten1024 1:18e8ead6f188 44 {
toriten1024 1:18e8ead6f188 45 myled2 = 1;
toriten1024 1:18e8ead6f188 46
toriten1024 1:18e8ead6f188 47 unsigned int b0_7 = (unsigned int)pc.getc();
toriten1024 1:18e8ead6f188 48 unsigned int b8_15 = (unsigned int)pc.getc();
toriten1024 1:18e8ead6f188 49 unsigned int b16_17 = (unsigned int)pc.getc();
toriten1024 1:18e8ead6f188 50
toriten1024 1:18e8ead6f188 51 unsigned int bit_18 = (b16_17 << 16) + (b8_15 << 8) + b0_7;
toriten1024 1:18e8ead6f188 52
toriten1024 1:18e8ead6f188 53 printf("%d:%d\n",i,bit_18);
toriten1024 0:80ae2acaa6a1 54
toriten1024 1:18e8ead6f188 55 flag = (flag == 0)? 1 : 0;
toriten1024 1:18e8ead6f188 56 myled = flag;
toriten1024 1:18e8ead6f188 57 x.data[i].value = bit_18;
toriten1024 1:18e8ead6f188 58 }
toriten1024 1:18e8ead6f188 59
toriten1024 1:18e8ead6f188 60
toriten1024 1:18e8ead6f188 61 mat::ConstMatrix W1(1, 1);
toriten1024 1:18e8ead6f188 62 W1.width = 50;
toriten1024 1:18e8ead6f188 63 W1.height = 784;
toriten1024 1:18e8ead6f188 64 W1.data = W1_param;
toriten1024 1:18e8ead6f188 65
toriten1024 1:18e8ead6f188 66 mat::ConstMatrix b1(1, 1);
toriten1024 1:18e8ead6f188 67 b1.width = 50;
toriten1024 1:18e8ead6f188 68 b1.height = 1;
toriten1024 1:18e8ead6f188 69 b1.data = b1_param;
toriten1024 1:18e8ead6f188 70
toriten1024 1:18e8ead6f188 71 mat::ConstMatrix W2(10, 50);
toriten1024 1:18e8ead6f188 72 W2.width = 10;
toriten1024 1:18e8ead6f188 73 W2.height = 50;
toriten1024 1:18e8ead6f188 74 W2.data = W2_param;
toriten1024 1:18e8ead6f188 75
toriten1024 1:18e8ead6f188 76
toriten1024 1:18e8ead6f188 77 mat::ConstMatrix b2(10, 1);
toriten1024 1:18e8ead6f188 78 b2.data = b2_param;
toriten1024 1:18e8ead6f188 79
toriten1024 1:18e8ead6f188 80
toriten1024 1:18e8ead6f188 81 printf("start\n");
toriten1024 1:18e8ead6f188 82
toriten1024 1:18e8ead6f188 83 //matrix
toriten1024 1:18e8ead6f188 84 mat::Matrix<Fix18> a1 = x.dot(W1) + b1;
toriten1024 1:18e8ead6f188 85 mat::Matrix<Fix18> z1 = a1.apply(relu);
toriten1024 1:18e8ead6f188 86 mat::Matrix<Fix18> a2 = z1.dot(W2) + b2;
toriten1024 1:18e8ead6f188 87 double result = a2.max_arg(0).data[0].to_double();
toriten1024 1:18e8ead6f188 88
toriten1024 1:18e8ead6f188 89 printf("result is %lf\n",result);
toriten1024 1:18e8ead6f188 90
toriten1024 1:18e8ead6f188 91 myled = 0;
toriten1024 1:18e8ead6f188 92
toriten1024 0:80ae2acaa6a1 93 }
toriten1024 1:18e8ead6f188 94 return 0;
toriten1024 0:80ae2acaa6a1 95 }