ryoaro ohara
/
c95_AIchip
AIチップをmbedから駆動するためのプログラムです.
main.cpp@1:18e8ead6f188, 2019-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |