在神经网络的训练过程中,EXC_BAD_ACCESS/KERN_INVALID_ADDRESS

在神经网络的训练过程中,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

我正在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         {
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是否为空?当我尝试打印F
outputNeuron[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 }