Matlab Arduino试图计算一个神经网络
我试图用下面的代码计算一个神经网络Matlab Arduino试图计算一个神经网络,matlab,arduino,neural-network,Matlab,Arduino,Neural Network,我试图用下面的代码计算一个神经网络 #include <math.h> double feat_hid[10]; double output[4]; const double w_hid[8][10] = { {0.0706307913427445,-0.332136075169963,1.86159334821608,1.55009706502897,1.55669357055137,-1.93539022266504,1.40698067828037,-0.1
#include <math.h>
double feat_hid[10];
double output[4];
const double w_hid[8][10] =
{
{0.0706307913427445,-0.332136075169963,1.86159334821608,1.55009706502897,1.55669357055137,-1.93539022266504,1.40698067828037,-0.196054693169832,-0.317952257631136,4.69951344792126},
{-0.860303689780744,-0.142965971622307,1.00938809624265,3.03147950247308,0.26570362705432,-0.63835074899079,-0.108472152405573,-0.465092677563643,-1.26640787415541,3.47897119519849},
{-0.272080445746987,0.388264886856488,1.93120693933139,2.63260374630115,-0.403646834510117,-1.69806363784962,-1.47457233648421,-1.50775491078107,-0.835555146571103,0.586017106027158},
{0.523268479966795,1.60528083325264,1.8945332979293,2.83572254589689,-1.68716858062427,-0.575246483351286,0.408066044886574,0.58303163597391,1.27390651063673,0.00318251321831592},
{0.363035740315566,-0.696513924175445,1.41563086072654,1.42184591641306,2.04584849389715,0.528929786530872,1.07312589674496,0.309695239536318,1.25983320795077,0.522937576790264},
{1.91097305183671,0.526449978690799,-0.00374666478341612,-0.783150846208907,1.01286141219052,-1.60758427665251,-0.040595792623655,-0.751738504583724,-0.930564482543811,-0.0312598878148829},
{-0.364318798326876,6.0862613777679,-1.97910374691563,-0.990892711032243,-4.01625281770135,-0.730723605319977,2.79951479383628,1.23870829231029,-1.96949038202552,-1.48674789633524},
{-2.51147997247322,-2.42006923324837,0.0825476300769622,0.780436871112016,-0.151841195266197,0.3603578344112,-1.10038496139283,1.01784327038377,-2.33380006889957,-0.276962857144392}
};
const double w_out[11][4] =
{
{-0.848153262003428,1.04206942072723,-0.56827515726385,0.368049168481758},
{2.65699122475564,-2.31195040158215,-0.324512289348535,-0.0248140339246439},
{0.819329194280546,0.039943623410223,-1.25202766689859,0.393685637397724},
{-1.28944659517956,2.66620424439295,-0.968011825082177,-0.404502491304304},
{-0.224432096177094,-0.239370531739619,1.95124987383465,-1.47584887746872},
{0.520195254302156,-0.0716719005040372,-0.795815587506882,0.344121703272989},
{-1.260329779349,2.04221311676928,0.251086051743563,-1.03192351329109},
{-0.680299559455324,0.452665873842875,-0.457043098095797,0.699247978937067},
{0.262467710721102,0.876119011755995,-1.84541649804428,0.689973715895836},
{0.602141912445942,-2.3913813206841,1.43782014708464,0.346066727829377},
{-0.0789595649460575,0.0759034703177117,-0.954465934396254,-1.06633481363805}
};
double accum;
double feature[7] = { 0.802748046, 0.79983412 ,-0.379610559, 0.02006534, 0.244444444 -1, 0.872340426};
void setup()
{
/* add setup code here */
Serial.begin(9600);
}
void loop()
{
for (int i = 0; i < 10; i++)
{
accum =0;
accum = w_hid[7][i];
for (int j = 0; j < 7; j++)
{
accum += feature[j] * w_hid[j][i];
}
//Serial.println(accum,4);
feat_hid[i] = tanh(accum);
}
for (int i = 0; i < 4; i++)
{
accum=0;
accum = w_hid[10][i];
for (int j = 0; j < 10; j++)
{
accum += feat_hid[j] * w_out[j][i];
}
output[i] = (accum);
}
Serial.println("wew");
Serial.println(output[0], 7);
Serial.println(output[1], 7);
Serial.println(output[2], 7);
Serial.println(output[3], 7);
for (size_t i = 0; i < 10; i++)
{
feat_hid[i] = 0;
}
for (size_t i = 0; i < 4; i++)
{
output[i] = 0;
}
}
#包括
双专长隐藏[10];
双输出[4];
常数双w_hid[8][10]=
{
{0.0706307913427445,-0.332136075169963,1.86159334821608,1.55009706502897,1.55669357055137,-1.93539022266504,1.40698067828037,-0.196054693169832,-0.317952257631136,4.69951344792126},
{-0.860303689780744,-0.142965971622307,1.00938809624265,3.03147950247308,0.26570362705432,-0.63835074899079,-0.108472152405573,-0.465092677563643,-1.26640787415541,3.47897119519849},
{-0.272080445746987,0.388264886856488,1.93120693933139,2.63260374630115,-0.403646834510117,-1.69806363784962,-1.47457233648421,-1.50775491078107,-0.835555146571103,0.586017106027158},
{0.523268479966795,1.60528083325264,1.8945332979293,2.83572254589689,-1.68716858062427,-0.575246483351286,0.408066044886574,0.58303163597391,1.27390651063673,0.00318251321831592},
{0.363035740315566,-0.696513924175445,1.41563086072654,1.42184591641306,2.04584849389715,0.528929786530872,1.07312589674496,0.309695239536318,1.25983320795077,0.522937576790264},
{1.91097305183671,0.526449978690799,-0.00374666478341612,-0.783150846208907,1.01286141219052,-1.60758427665251,-0.040595792623655,-0.751738504583724,-0.930564482543811,-0.0312598878148829},
{-0.364318798326876,6.0862613777679,-1.97910374691563,-0.990892711032243,-4.01625281770135,-0.730723605319977,2.79951479383628,1.23870829231029,-1.96949038202552,-1.48674789633524},
{-2.51147997247322,-2.42006923324837,0.0825476300769622,0.780436871112016,-0.151841195266197,0.3603578344112,-1.10038496139283,1.01784327038377,-2.33380006889957,-0.276962857144392}
};
常数双w_out[11][4]=
{
{-0.848153262003428,1.04206942072723,-0.56827515726385,0.368049168481758},
{2.65699122475564,-2.31195040158215,-0.324512289348535,-0.0248140339246439},
{0.819329194280546,0.039943623410223,-1.25202766689859,0.393685637397724},
{-1.28944659517956,2.66620424439295,-0.968011825082177,-0.404502491304304},
{-0.224432096177094,-0.239370531739619,1.95124987383465,-1.47584887746872},
{0.520195254302156,-0.0716719005040372,-0.795815587506882,0.344121703272989},
{-1.260329779349,2.04221311676928,0.251086051743563,-1.03192351329109},
{-0.680299559455324,0.452665873842875,-0.457043098095797,0.699247978937067},
{0.262467710721102,0.876119011755995,-1.84541649804428,0.689973715895836},
{0.602141912445942,-2.3913813206841,1.43782014708464,0.346066727829377},
{-0.0789595649460575,0.0759034703177117,-0.954465934396254,-1.06633481363805}
};
双累积;
双特征[7]={0.802748046,0.79983412,-0.379610559,0.02006534,0.2444444-1,0.872340426};
无效设置()
{
/*在此处添加设置代码*/
Serial.begin(9600);
}
void循环()
{
对于(int i=0;i<10;i++)
{
累计=0;
累计=w_hid[7][i];
对于(int j=0;j<7;j++)
{
累计+=特征[j]*w_hid[j][i];
}
//连续打印(累计4次);
功绩hid[i]=tanh(累计);
}
对于(int i=0;i<4;i++)
{
累计=0;
累计=w_hid[10][i];
对于(int j=0;j<10;j++)
{
累计+=专长隐藏[j]*w_out[j][i];
}
输出[i]=(累计);
}
Serial.println(“wew”);
Serial.println(输出[0],7);
Serial.println(输出[1],7);
Serial.println(输出[2],7);
Serial.println(输出[3],7);
对于(大小i=0;i<10;i++)
{
专长隐藏[i]=0;
}
对于(大小i=0;i<4;i++)
{
输出[i]=0;
}
}
输出按以下值进行:
-2.0422704
-0.2195258
3.6133847
-1.3158617
但是,当我尝试使用matlab重新计算时,输出经过(这是正确的):
0.856575444075245
-0.997328999300809
-0.911066976760467
-0.949747387652545
我的问题是,arduino和浮动/双重计算是否存在错误,导致计算结果错误?我记得,上面的草图和matlab代码之间的代码是相似的
感谢您的反馈~双功能[7]={0.802748046,0.79983412,-0.379610559,0.02006534,0.2444444-1,0.872340426} 你忘了这两个值之间有个逗号吗
(很抱歉将此作为回答,仍然无法在此发表评论)双功能[7]={0.802748046,0.79983412,-0.379610559,0.02006534,0.2444444-1,0.872340426} 你忘了这两个值之间有个逗号吗
(很抱歉将此作为答案发布,仍然无法在此发表评论)如果您想知道在整个计算过程中数据是否被截断等问题,请在执行计算时使用Serial.println查看问题所在。@JoshEngelsma好的,我从第一次计算开始就尝试过了,但它已经错了(我记得),可能数组的调用是错误的?谢谢你的评论~我已经在我的电脑上构建了你的程序,我得到了与你的arduino相同的结果。问题不是arduino问题。你确定你的代码是正确的吗?谢谢@oreljul的评论,我已经得到了。如果你想知道在整个计算过程中数据被截断等等“好吧,只要在执行计算时使用Serial.println,看看问题出在哪里。@JoshEngelsma好吧,我从第一次计算开始就试过了,但已经错了(我记得),可能数组的调用是错误的?谢谢你的评论~我已经在我的电脑上构建了你的程序,我得到了与你的arduino相同的结果。问题不是arduino问题。你确定你的代码是正确的吗?谢谢你的评论@oreljul,我已经得到了。确实是问题吗?确实是问题吗?