归一化神经网络中的权重

问题描述

由于参数-> 权重过大,算术异常不断发生。 所以我决定将它们标准化。当我应用下面的代码时,准确率并没有那么高,在第一个 epoch 时大约为 20%。

我怎样才能更好地标准化体重?

我是否也必须对偏见做些什么?

我的最终目标是让权重变小。有没有比标准化更好的方法

void normalize(int m,int n,double *A){
    int i,j;
    double sum=0;

    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            sum +=  pow(A[i * n + j],2);
        }
        for (j = 0; j < n; j++){
            A[i * n + j]=A[i * n + j]/(sqrt(sum));
        }
    }
}
void backward6(double *A1,double *A2,double *A3,const double *b1,const double *b2,const double *b3,const double *x,unsigned char t,double *y,double *dEdA1,double *dEdA2,double *dEdA3,double *dEdb1,double *dEdb2,double *dEdb3){

    double  * before_fc1 = malloc(sizeof(double) * 784);
    double  * before_fc2 = malloc(sizeof(double) * 50);
    double  * before_fc3 = malloc(sizeof(double) * 100);
    double  * before_relu1 = malloc(sizeof(double) * 50);
    double  * before_relu2 = malloc(sizeof(double) * 100);

    double * y0 = malloc(sizeof(double) * 784);
    double * y1 = malloc(sizeof(double) * 50);
    double * y2 = malloc(sizeof(double) * 100);
    double *y3 = malloc(sizeof(double) * 10);

    //順伝播
    copy(1,784,x,before_fc1);
    normalize(50,A1);
    fc(50,A1,b1,before_relu1);
    relu(50,before_relu1,before_fc2);
    normalize(100,50,A2);
    fc(100,before_fc2,A2,b2,before_relu2);
    relu(100,before_relu2,before_fc3);
    normalize(10,100,A3);
    fc(10,before_fc3,A3,b3,y);
    softmax(10,y,y);

    //逆伝播
    softmaxwithloss_bwd(10,t,y3);
    fc_bwd(10,y3,dEdA3,dEdb3,y2);
    relu_bwd(100,y2,y2);
    fc_bwd(100,dEdA2,dEdb2,y1);
    relu_bwd(50,y1,y1);
    fc_bwd(50,before_fc1,dEdA1,dEdb1,y0);

    //メモリ解放
    free(y0);free(y1);free(y2);free(y3);
    free(before_fc1);free(before_fc2);free(before_fc3);
    free(before_relu1);free(before_relu2);
}
//6層による推論を行い、得られた結果[0:9]を返す
int inference6(const double *A1,const double *A2,const double *A3,double * y){

    double * y1 = malloc(sizeof(double) * 50);
    double * y2 = malloc(sizeof(double) * 100);
    fc(50,y1);
    relu(50,y1);
    fc(100,y2);
    relu(100,y2);
    fc(10,y);

    double max = y[0]; //yの要素の最大のもの
    int index = 0;    //yの要素が最大の時の添字
    int i;

    for (i = 0; i < 10; i++){
        if (y[i] > max){
            max = y[i];
            index = i;
        }
    }
    free(y1);
    free(y2);
    return index;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)