在神经网络的训练过程中,EXC_BAD_ACCESS/KERN_INVALID_ADDRESS
我正在MAC OS X Yosemite上用c99编译我的神经网络 gdb没有给我很多信息,所以我使用了很多printf来定义我的问题所在。 以下是gdb给我的信息:在神经网络的训练过程中,EXC_BAD_ACCESS/KERN_INVALID_ADDRESS,c,segmentation-fault,neural-network,C,Segmentation Fault,Neural Network,我正在MAC OS X Yosemite上用c99编译我的神经网络 gdb没有给我很多信息,所以我使用了很多printf来定义我的问题所在。 以下是gdb给我的信息: 进入错误输出0 0.000000 程序收到信号EXC\u访问错误,无法访问内存。 原因:KERN\u地址无效\u地址:0x0000000000000000 0x0000000000000000英寸??() 这是我的代码: 127 for (int k = 0; k < 94; k++) 128
进入错误输出0
0.000000
程序收到信号EXC\u访问错误,无法访问内存。
原因:KERN\u地址无效\u地址:0x0000000000000000
0x0000000000000000英寸??()
这是我的代码:
127 for (int k = 0; k < 94; k++)
128 {
129 printf("\nentering into error output %d\n", k);
130 printf("\n%lf\n", results[k]);
131 printf("\n%lf\n", outputNeuron[k].output(&outputNeuron[k]));
132 printf("\n%lf\n", sigmoid.derivative(outputNeuron[k].output(&outputNeuron[k])));
133
134 outputNeuron[k].error =
135 sigmoid.derivative(outputNeuron[k].output(&outputNeuron[k])) *
136 (results[k] - outputNeuron[k].output(&outputNeuron[k]));
137
138 printf("\n adjustWeights output %d\n", k);
139 outputNeuron[k].adjustWeights(&outputNeuron[k]);
140
141 printf("\nerror output %d ok\n", k);
142 }
127表示(int k=0;k<94;k++)
128 {
129 printf(“\n输入到错误输出%d\n”,k);
130 printf(“\n%lf\n”,结果[k]);
131 printf(“\n%lf\n”,outputNeuron[k]。output(&outputNeuron[k]);
132 printf(“\n%lf\n”,S形导数(outputNeuron[k]。output(&outputNeuron[k]));
133
134输出神经元[k]。错误=
135 S形导数(输出神经元[k]。输出(&输出神经元[k])*
136(结果[k]-outputNeuron[k]。输出(&outputNeuron[k]);
137
138 printf(“\n输出%d\n”,k);
139 outputNeuron[k]。调整权重(&outputNeuron[k]);
140
141 printf(“\n错误输出%d正常\n”,k);
142 }
如果你还需要什么,尽管问吧,因为我想你是我最后的希望
编辑:
77 TNeuron输出神经元[94];
78如果(是空的(文件))
79表示(int k=0;k<94;k++)
80 {
81 outputNeuron[k]=TNeuron_create();
82 outputNeuron[k]。随机加权(&outputNeuron[k]);
83 }
文件现在是空的
下面是TNeuron_create():
37 TNeuron TNeuron_create()
38 {
39.本公司的结构;
40欧元初始值(&This);
41把这个还给我;
42 }
43
44无效TNeuron_Init(结构TNeuron*This)
45 {
46本->输出=TNeuron\U输出;
47
48本->随机加权=tEURON_随机加权;
49
50本->调整重量=t欧元调整重量;
51
52表示(int i=0;i<20;i++)
53表示(int j=0;j<20;j++)
54 {
55该->输入[i][j]=0;
56该->权重[i][j]=0;
57 }
58
59此->错误=0;
60
61此->biasWeight=0;
62 }
编辑2:
5 double TNeuron_output(struct TNeuron *This)
6 {
7 TSigmoid sigmoid = TSigmoid_create();
8
9 double op = 0;
10 for (int i = 0; i < 20; i++)
11 for (int j = 0; j < 20; j++)
12 op += This->weights[i][j] * This->inputs[i][j];
13
14 return sigmoid.output(op + This->biasWeight);
15 }
5双TNeuron\u输出(结构TNeuron*This)
6 {
7 t乙状结肠乙状结肠=t乙状结肠_create();
8.
9双op=0;
10表示(int i=0;i<20;i++)
11表示(int j=0;j<20;j++)
12 op+=此->权重[i][j]*此->输入[i][j];
13
14返回sigmoid.输出(op+This->biasWeight);
15 }
outputNeuron是如何定义和初始化的?outputNeuron是否为空?当我尝试打印FoutputNeuron[k]时,出现了一个段错误.output
所以我认为问题出在outputNeuron
上,但是hiddenNeuron
s的制作方法相同,看起来对它们没有问题。也许你应该用printfs插入TNeuron\u output()
和tsigomoid\u output()
。看起来您的程序在这两个函数中的一个函数中正在消亡。没有完整的代码,很难说在哪里TNeuron_输出
似乎正常,因此问题可能出在TSigmoid_输出
中。或者它可能是tsigomoid_create()
,但我希望这个函数很简单。问题是,当我的NN只是一个XOR时,这些函数就工作了,我没有对它们做任何更改TSigmoid
仅包含我使用的数学公式。
37 TNeuron TNeuron_create()
38 {
39 struct TNeuron This;
40 TNeuron_Init(&This);
41 return This;
42 }
43
44 void TNeuron_Init(struct TNeuron *This)
45 {
46 This->output = TNeuron_output;
47
48 This->randomizeWeights = TNeuron_randomizeWeights;
49
50 This->adjustWeights = TNeuron_adjustWeights;
51
52 for (int i = 0; i < 20; i++)
53 for (int j = 0; j < 20; j++)
54 {
55 This->inputs[i][j] = 0;
56 This->weights[i][j] = 0;
57 }
58
59 This->error = 0;
60
61 This->biasWeight = 0;
62 }
5 double TNeuron_output(struct TNeuron *This)
6 {
7 TSigmoid sigmoid = TSigmoid_create();
8
9 double op = 0;
10 for (int i = 0; i < 20; i++)
11 for (int j = 0; j < 20; j++)
12 op += This->weights[i][j] * This->inputs[i][j];
13
14 return sigmoid.output(op + This->biasWeight);
15 }