写了一个用relu实现BP神经网络的代码,但是发现relu使得ou输出都是0,但是还是不行,错误率高达60%,我是自学的,代码可能存在错误,下面是主要的代码,希望能够得到网上各位大神的帮忙,谢谢了
double* backward(double *delta)
{
for (int i = 0; i < onum; i++)
{
deto[i] = delta[i];
for (int j = 0; j < hnum; j++)
wo[j][i] = wo[j][i] + learnrate*delta[i]*xh[j];
}
for (int i = 0; i < hnum; i++)
{
for (int j = 0; j < onum; j++)
deth[i] += deto[j] * wo[i][j]*relubk(xh[i]);
for (int j = 0; j < inum; j++)
wi[j][i] += learnrate*deth[i]*xi[j];
}
for (int i = 0; i < inum; i++)
for (int j = 0; j < hnum; j++)
deti[i] += deth[j] * wi[i][j] * relubk(xi[i]);
for(int i=0;i<onum;i++)
obias[i]+= learnrate*delta[i];
for (int i = 0; i < hnum; i++)
hbias[i] += learnrate*deth[i];
return deti;
}
我最后一级用了sigmoid
double *dec(double *x, double *y, int l, double *det)
{
double det2[N] = { 0 };
for (int i = 0; i < l; i++)
{
xou[i] = 0;
for (int j = 0; j < l; j++)
xou[i] += x[j] * weight[j][i];
xou[i] = 1.0 / (1.0 + exp(-xou[i] - bias[i]));
//fl << "xou" << i << xou[i] << ' ';
}
fl << endl;
for (int i = 0; i < l; i++)
{
det2[i] = (y[i] - xou[i])*(1-xou[i])*xou[i];
fl << det2[i] << "," << y[i] << endl;
for (int j = 0; j < l; j++)
{
weight[j][i] += learnrate*det2[i] * x[i];
}
}
for (int i = 0; i < l; i++)
{
bias[i] += learnrate*det2[i];
}
for (int i = 0; i < l; i++)
{
det[i] = 0;
for (int j = 0; j < l; j++)
det[i] += relubk(x[i])*det2[j] * weight[i][j];
fl << "det" << i << ":" << det[i] << ' ';
}