本人在做神经网络时,使用了一个权值微调的函数,结果程序在执行完此函数后在别处莫名出错,不用本函数则运行正常,怀疑是我的函数写的有问题,可是我个人看不出来,求各位高手指点迷津。不了解rbf神经网络不要紧,尽请看本函数,找到它书写不规范,可能引起错误的地方,拜托了。//LPCLASS_VECTOR X, int N,    X是一个样本数组,N是其个数,但只取双数训练
//LPCLASS_CENTER Y, int clsnum  Y是一个类心数组,clsnum是类心个数
//double **hidden_weights     是从rbf层到输出层的权值矩阵,在本函数前已定义,本函数要微调的对象
//int newclsnum     是输出层的结点个数
//loop 是循环次数,每次循环都针对所有双数样本
BOOL RBFNN_gradsTrain(LPCLASS_VECTOR X, int N, LPCLASS_CENTER Y, int clsnum,int newclsnum,double **hidden_weights,int loop)
{
int  i, j, k;       
int nDimension = Y[0].nDimension;
double **rbf_result;//记录每个样本对各类心的输出值

rbf_result=(double**)malloc(clsnum*sizeof(double*));
if(rbf_result==NULL)
return FALSE;
for(i=0;i<clsnum;i++)

rbf_result[i]=(double *)malloc(N* sizeof(double));
if(rbf_result[i]==NULL)
return FALSE;
}
for(i=0;i<N;i+=2) 
{  
for(k=0;k<clsnum;k++)
{
double Distance=0.0;
for(j=0;j<nDimension;j++) 
Distance+=(X[i].Data[j]-Y[k].Data[j])*/
                                                (X[i].Data[j]-Y[k].Data[j]);
Distance/=(20*Y[k].fangcha);
rbf_result[k][i]=exp((-1)*Distance);//rbf output
}
}
int l=0;
double studyspeed=0.02;
double *result=(double *)malloc(newclsnum* sizeof(double));
double *expectresult=(double *)malloc(newclsnum* sizeof(double));
while(l<loop)
{
for(i=0;i<N;i+=2)//每次循环都针对所有训练样本
{ for(k=0;k<newclsnum;k++)
{
result[k]=0;expectresult[k]=0;
for(j=0;j<clsnum;j++)
{result[k]+=rbf_result[j][i]/
                                                  *hidden_weightsj][k];
                                              }

}
int temp=X[i].nCluster-1;
expectresult[temp]=1; double he=0;
for(j=0;j<clsnum;j++)
he+=rbf_result[j][i];

for(j=0;j<clsnum;j++)
{
for(k=0;k<newclsnum;k++)
                                     //梯度下降更新权值矩阵,studyspeed随循环逐次变小
{
hidden_weights[k][j]+=studyspeed*(loop-l)*/
                                                   (expectresult[k]-result[k])/(loop*he);
}
}
}
l++;
}//观察用
FILE *ftemp;
ftemp=fopen("e:\\hidden_weight.txt","w");
fprintf(ftemp,"hidden_weight:\n\n");
for(i=0;i<newclsnum;i++)
{
for(j=0;j<clsnum;j++)
fprintf(ftemp,"%f  ",hidden_weights[j][i]);
fprintf(ftemp,"\n");
}
fclose(ftemp);
//观察用 free(result);
free(expectresult); for(i=0;i<clsnum;i++)
{
if(rbf_result[i]!=NULL)
free(rbf_result[i]);
}
if(rbf_result!=NULL)
free(rbf_result);
return TRUE;
}

解决方案 »

  1.   

    其中被多次换行的一句是
    hidden_weights[k][j]+=studyspeed*(loop-l)*                                        (expectresult[k]-result[k])/(loop*he);
      

  2.   

    首先给出我程序中所用结构体的定义,方便阅读。
    typedef struct _CLASS_VECTOR
    {
    double * Data;   //输入向量
    int nCluster;}CLASS_VECTOR, * LPCLASS_VECTOR;typedef struct _CLASS_CENTER
    {
    double * Data;
    int nDimension; 
    int Num;
    double fangcha;
    }CLASS_CENTER, * LPCLASS_CENTER;在程序的后来,我定义了一个类似LPCLASS_VECTOR X的数组,以对待分类样本分类,在为这个数组分配空间并赋值时,发现不到数组规定长度的地方,程序无法继续,而前部数组已正确赋值,比如我的数组长3000,到了第1112数组元素时,程序出错,说我引用内存错误。我放弃了对这个数组的操作,程序似乎可以运行,但当我关闭本程序的时候,则弹出“0x10214556”指令引用的“0x1dd0e7c7”内存。该内存不能为“read”。
    要终止程序,请单击“确定”。随后程序关闭,而未提供调试选择。总之我认为在以上函数中会有非法使用内存的现象,但我不清楚怎么回事。谢谢关注。
      

  3.   

    关于这个问题,我有了新思路,问题可能出在对hidden_weights的修改上,这是一个在主程序里设计的数组,前面已经有一个函数计算并为其赋值,在本函数里,虽然我用指针传入该数组的首址,意图对它进一步修改,但似乎这样做有点不对,故发生错误。
      

  4.   

    问题已找到,hidden_weights是个二维数组指针,这个数组两次使用时,我将维数搞反了,汗啊。对不起大家,由于全部程序不在这里,单凭本程序自然看不出毛病。感谢太平洋的指点。
      

  5.   

    在本函数的观察段,大家可以看到前后的hidden_weight维数与修正段的不同,修正段维数颠倒。