【发布时间】:2018-10-24 09:24:41
【问题描述】:
我一直在尝试用 C++ 创建一个神经网络,但我的反向传播代码没有按照我想要的方式工作。我有一个文本文档,告诉网络如何运行。我有 2 个输入神经元,1 个隐藏层,4 个神经元和 2 个输出神经元。我现在正在学习成为 XOR 门。我有它,所以它需要网络的成本,将其乘以 0.55(缩放)并从权重/偏差中添加/减去它,具体取决于输出与正确答案的接近程度以及权重/偏差与否' 是 + 或 -。代码如下:
void Network::backProp(void)
{
double b = 0,a;
int loop,l;
for(loop=0;loop<4;loop++)
{
//Adds up the cost of the data
b = b + (pow(results[2*loop]-key[4*loop+2],2)+pow(results[2*loop+1]-key[4*loop+3],2));
}
a=.55*b;
if(b>.01)
{
for(l=0;l<4;l++)
{
if(round(results[2*l])!=key[4*l+2])
{
if(data[0] <= 0)
{
data[0] = data[0]+a; //(abs(data[0])/a);
}
else
{
data[0] = data[0]-a; //(abs(data[0])/a);
}
if(data[1] <= 0)
{
data[1] = data[1]+a; //(abs(data[1])/a);
}
else
{
data[1] = data[1]-a; //(abs(data[1])/a);
}
if(data[2] <= 0)
{
data[2] = data[2]+a; //(abs(data[2])/a);
}
else
{
data[2] = data[2]-a; //(abs(data[2])/a);
}
if(data[3] <= 0)
{
data[3] = data[3]+a; //(abs(data[3])/a);
}
else
{
data[3] = data[3]-a; //(abs(data[3])/a);
}
if(data[4] <= 0)
{
data[4] = data[4]+a; //(abs(data[4])/a);
}
else
{
data[4] = data[4]-a; //(abs(data[4])/a);
}
if(data[6] <= 0)
{
data[6] = data[6]+a; //(abs(data[6])/a);
}
else
{
data[6] = data[6]-a; //(abs(data[6])/a);
}
if(data[7] <= 0)
{
data[7] = data[7]+a; //(abs(data[7])/a);
}
else
{
data[7] = data[7]-a; //(abs(data[7])/a);
}
if(data[8] <= 0)
{
data[8] = data[8]+a; //(abs(data[8])/a);
}
else
{
data[8] = data[8]-a; //(abs(data[8])/a);
}
if(data[9] <= 0)
{
data[9] = data[9]+a; //(abs(data[9])/a);
}
else
{
data[9] = data[9]-a; //(abs(data[9])/a);
}
if(data[10] <= 0)
{
data[10] = data[10]+a; //(abs(data[10])/a);
}
else
{
data[10] = data[10]-a; //(abs(data[10])/a);
}
if(data[11] <= 0)
{
data[11] = data[11]+a; //(abs(data[11])/a);
}
else
{
data[11] = data[11]-a; //(abs(data[11])/a);
}
if(data[12] <= 0)
{
data[12] = data[12]+a; //(abs(data[12])/a);
}
else
{
data[12] = data[12]-a; //(abs(data[12])/a);
}
if(data[13] <= 0)
{
data[13] = data[13]+a; //(abs(data[13])/a);
}
else
{
data[13] = data[13]-a; //(abs(data[13])/a);
}
if(data[14] <= 0)
{
data[14] = data[14]+a; //(abs(data[14])/a);
}
else
{
data[14] = data[14]-a; //(abs(data[14])/a);
}
if(data[16] <= 0)
{
data[16] = data[16]+a; //(abs(data[16])/a);
}
else
{
data[16] = data[16]-a; //(abs(data[16])/a);
}
if(data[18] <= 0)
{
data[18] = data[18]+a; //(abs(data[18])/a);
}
else
{
data[18] = data[18]-a; //(abs(data[18])/a);
}
if(data[20] <= 0)
{
data[20] = data[20]+a; //(abs(data[20])/a);
}
else
{
data[20] = data[20]-a; //(abs(data[20])/a);
}
}
else
{
if(data[0] <= 0)
{
data[0] = data[0]-a; //(abs(data[0])/a);
}
else
{
data[0] = data[0]+a; //(abs(data[0])/a);
}
if(data[1] <= 0)
{
data[1] = data[1]-a; //(abs(data[1])/a);
}
else
{
data[1] = data[1]+a; //(abs(data[1])/a);
}
if(data[2] <= 0)
{
data[2] = data[2]-a; //(abs(data[2])/a);
}
else
{
data[2] = data[2]+a; //(abs(data[2])/a);
}
if(data[3] <= 0)
{
data[3] = data[3]-a; //(abs(data[3])/a);
}
else
{
data[3] = data[3]+a; //(abs(data[3])/a);
}
if(data[4] <= 0)
{
data[4] = data[4]-a; //(abs(data[4])/a);
}
else
{
data[4] = data[4]+a; //(abs(data[4])/a);
}
if(data[6] <= 0)
{
data[6] = data[6]-a; //(abs(data[6])/a);
}
else
{
data[6] = data[6]+a; //(abs(data[6])/a);
}
if(data[7] <= 0)
{
data[7] = data[7]-a; //(abs(data[7])/a);
}
else
{
data[7] = data[7]+a; //(abs(data[7])/a);
}
if(data[8] <= 0)
{
data[8] = data[8]-a; //(abs(data[8])/a);
}
else
{
data[8] = data[8]+a; //(abs(data[8])/a);
}
if(data[9] <= 0)
{
data[9] = data[9]-a; //(abs(data[9])/a);
}
else
{
data[9] = data[9]+a; //(abs(data[9])/a);
}
if(data[10] <= 0)
{
data[10] = data[10]-a; //(abs(data[10])/a);
}
else
{
data[10] = data[10]+a; //(abs(data[10])/a);
}
if(data[11] <= 0)
{
data[11] = data[11]-a; //(abs(data[11])/a);
}
else
{
data[11] = data[11]+a; //(abs(data[11])/a);
}
if(data[12] <= 0)
{
data[12] = data[12]-a; //(abs(data[12])/a);
}
else
{
data[12] = data[12]+a; //(abs(data[12])/a);
}
if(data[13] <= 0)
{
data[13] = data[13]-a; //(abs(data[13])/a);
}
else
{
data[13] = data[13]+a; //(abs(data[13])/a);
}
if(data[14] <= 0)
{
data[14] = data[14]-a; //(abs(data[14])/a);
}
else
{
data[14] = data[14]+a; //(abs(data[14])/a);
}
if(data[16] <= 0)
{
data[16] = data[16]-a; //(abs(data[16])/a);
}
else
{
data[16] = data[16]+a; //(abs(data[16])/a);
}
if(data[18] <= 0)
{
data[18] = data[18]-a; //(abs(data[18])/a);
}
else
{
data[18] = data[18]+a; //(abs(data[18])/a);
}
if(data[20] <= 0)
{
data[20] = data[20]-a; //(abs(data[20])/a);
}
else
{
data[20] = data[20]+a; //(abs(data[20])/a);
}
}
if(round(results[2*l+1])!=key[4*l+3])
{
if(data[0] <= 0)
{
data[0] = data[0]+a; //(abs(data[0])/a);
}
else
{
data[0] = data[0]-a; //(abs(data[0])/a);
}
if(data[1] <= 0)
{
data[1] = data[1]+a; //(abs(data[1])/a);
}
else
{
data[1] = data[1]-a; //(abs(data[1])/a);
}
if(data[2] <= 0)
{
data[2] = data[2]+a; //(abs(data[2])/a);
}
else
{
data[2] = data[2]-a; //(abs(data[2])/a);
}
if(data[3] <= 0)
{
data[3] = data[3]+a; //(abs(data[3])/a);
}
else
{
data[3] = data[3]-a; //(abs(data[3])/a);
}
if(data[4] <= 0)
{
data[4] = data[4]+a; //(abs(data[4])/a);
}
else
{
data[4] = data[4]-a; //(abs(data[4])/a);
}
if(data[5] <= 0)
{
data[5] = data[5]+a; //(abs(data[5])/a);
}
else
{
data[5] = data[5]-a; //(abs(data[5])/a);
}
if(data[7] <= 0)
{
data[7] = data[7]+a; //(abs(data[7])/a);
}
else
{
data[7] = data[7]-a; //(abs(data[7])/a);
}
if(data[8] <= 0)
{
data[8] = data[8]+a; //(abs(data[8])/a);
}
else
{
data[8] = data[8]-a; //(abs(data[8])/a);
}
if(data[9] <= 0)
{
data[9] = data[9]+a; //(abs(data[9])/a);
}
else
{
data[9] = data[9]-a; //(abs(data[9])/a);
}
if(data[10] <= 0)
{
data[10] = data[10]+a; //(abs(data[10])/a);
}
else
{
data[10] = data[10]-a; //(abs(data[10])/a);
}
if(data[11] <= 0)
{
data[11] = data[11]+a; //(abs(data[11])/a);
}
else
{
data[11] = data[11]-a; //(abs(data[11])/a);
}
if(data[12] <= 0)
{
data[12] = data[12]+a; //(abs(data[12])/a);
}
else
{
data[12] = data[12]-a; //(abs(data[12])/a);
}
if(data[13] <= 0)
{
data[13] = data[13]+a; //(abs(data[13])/a);
}
else
{
data[13] = data[13]-a; //(abs(data[13])/a);
}
if(data[15] <= 0)
{
data[15] = data[15]+a; //(abs(data[15])/a);
}
else
{
data[15] = data[15]-a; //(abs(data[15])/a);
}
if(data[17] <= 0)
{
data[17] = data[17]+a; //(abs(data[17])/a);
}
else
{
data[17] = data[17]-a; //(abs(data[17])/a);
}
if(data[19] <= 0)
{
data[19] = data[19]+a; //(abs(data[19])/a);
}
else
{
data[19] = data[19]-a; //(abs(data[19])/a);
}
if(data[21] <= 0)
{
data[21] = data[21]+a; //(abs(data[21])/a);
}
else
{
data[21] = data[21]-a; //(abs(data[21])/a);
}
}
else
{
if(data[0] <= 0)
{
data[0] = data[0]-a; //(abs(data[0])/a);
}
else
{
data[0] = data[0]+a; //(abs(data[0])/a);
}
if(data[1] <= 0)
{
data[1] = data[1]-a; //(abs(data[1])/a);
}
else
{
data[1] = data[1]+a; //(abs(data[1])/a);
}
if(data[2] <= 0)
{
data[2] = data[2]-a; //(abs(data[2])/a);
}
else
{
data[2] = data[2]+a; //(abs(data[2])/a);
}
if(data[3] <= 0)
{
data[3] = data[3]-a; //(abs(data[3])/a);
}
else
{
data[3] = data[3]+a; //(abs(data[3])/a);
}
if(data[4] <= 0)
{
data[4] = data[4]-a; //(abs(data[4])/a);
}
else
{
data[4] = data[4]+a; //(abs(data[4])/a);
}
if(data[5] <= 0)
{
data[5] = data[5]-a; //(abs(data[5])/a);
}
else
{
data[5] = data[5]+a; //(abs(data[5])/a);
}
if(data[7] <= 0)
{
data[7] = data[7]-a; //(abs(data[7])/a);
}
else
{
data[7] = data[7]+a; //(abs(data[7])/a);
}
if(data[8] <= 0)
{
data[8] = data[8]-a; //(abs(data[8])/a);
}
else
{
data[8] = data[8]+a; //(abs(data[8])/a);
}
if(data[9] <= 0)
{
data[9] = data[9]-a; //(abs(data[9])/a);
}
else
{
data[9] = data[9]+a; //(abs(data[9])/a);
}
if(data[10] <= 0)
{
data[10] = data[10]-a; //(abs(data[10])/a);
}
else
{
data[10] = data[10]+a; //(abs(data[10])/a);
}
if(data[11] <= 0)
{
data[11] = data[11]-a; //(abs(data[11])/a);
}
else
{
data[11] = data[11]+a; //(abs(data[11])/a);
}
if(data[12] <= 0)
{
data[12] = data[12]-a; //(abs(data[12])/a);
}
else
{
data[12] = data[12]+a; //(abs(data[12])/a);
}
if(data[13] <= 0)
{
data[13] = data[13]-a; //(abs(data[13])/a);
}
else
{
data[13] = data[13]+a; //(abs(data[13])/a);
}
if(data[15] <= 0)
{
data[15] = data[15]-a; //(abs(data[15])/a);
}
else
{
data[15] = data[15]+a; //(abs(data[15])/a);
}
if(data[17] <= 0)
{
data[17] = data[17]-a; //(abs(data[17])/a);
}
else
{
data[17] = data[17]+a; //(abs(data[17])/a);
}
if(data[19] <= 0)
{
data[19] = data[19]-a; //(abs(data[19])/a);
}
else
{
data[19] = data[19]+a; //(abs(data[19])/a);
}
if(data[21] <= 0)
{
data[21] = data[21]-a; //(abs(data[21])/a);
}
else
{
data[21] = data[21]+a; //(abs(data[21])/a);
}
}
}
}
}
我知道这是一团糟,但这就是我想出的。如果有帮助,我可以发布其余的代码。
【问题讨论】:
-
我认为你有一个关于
data[5]的复制+粘贴错字,如果你写了一个循环而不是一遍又一遍地粘贴相同的代码,就不会发生这种情况。data[17]是否应该丢失?data[19]是否应该丢失? -
我试过做一个循环,但我试过了,它不起作用,因为对于第一个大 if 语句,我不使用数据[5,15,17,19,21]如果我不使用 data[6,14,16,18,20]
-
@MSalters OP 的问题是关于 NN 中的反向传播,几乎相同的 if 语句没有任何问题,尤其是因为它们并非全部用于所指出的所有条件。
标签: c++ neural-network