我很确定这是一个简单的错误,但我还是找不到。有人能发现错误吗?我对阵列CCD_ 1和CCD_。但在函数结束后,我尝试使用momentumVelocity
,它就是一个空指针。另一侧的CCD_ 4被初始化。
randomizeNeuron(...)
函数只更改值,在该函数中也存在monumentumVelocity`。
typedef struct{
double output;
int numWeights;
double* weights;
double* momentumVelocity;
double wBias;
double error;
double inputSum;
}NeuronTanh;
typedef struct{
int numNeurons;
NeuronTanh* neurons;
}Layer;
typedef struct{
int numLayers;
Layer* layers;
double prevError;
double currentError;
double currentLearningRate;
}Network;
void initializeNetwork(Network* network){
//malloc stuff
network->numLayers = NUMBER_LAYERS;
network->layers = malloc(NUMBER_LAYERS * sizeof(Layer));
network->layers[0].numNeurons = SIZE_INPUT_LAYER;
network->layers[1].numNeurons = SIZE_HIDDEN_LAYER1;
network->layers[2].numNeurons = SIZE_HIDDEN_LAYER2;
network->layers[3].numNeurons = SIZE_OUTPUT_LAYER;
for(int currentLayerIndex=0; currentLayerIndex<network->numLayers;++currentLayerIndex){
Layer *l = &network->layers[currentLayerIndex];
l->neurons = malloc(l->numNeurons * sizeof(NeuronTanh));
for(int j=0; j<l->numNeurons; ++j){
if(currentLayerIndex==0){
l->neurons[j].numWeights = SIZE_INPUT;
}else{
l->neurons[j].numWeights = network->layers[currentLayerIndex-1].numNeurons;
}
l->neurons[j].weights = malloc((l->neurons[j].numWeights) * sizeof(double));
l->neurons[j].momentumVelocity = malloc((l->neurons[j].numWeights) * sizeof(double));
randomizeNeuron(&(l->neurons[j]), getmaxInitValue(network, currentLayerIndex));
}
}
network->currentError = 0;
network->currentLearningRate = LEARNING_RATE;
network->prevError = 0;
}
如果没有其他隐藏问题,那么在对malloc:的两次调用中使用相同的计算
(l->神经元[j].numWeights)*大小(双)
那么malloc失败并返回一个空指针。换句话说,您没有足够的连续可用内存来执行分配。我不知道(l->neurons[j].numWeights)的值:如果这是一个巨大的数字,而你没有很多RAM,那么这可能就是问题所在。
尝试交换对malloc的两个调用,看看第二个调用是否失败。这会告诉你很多。