微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

归一化神经网络中的权重

如何解决归一化神经网络中的权重

由于参数-> 权重过大,算术异常不断发生。 所以我决定将它们标准化。当我应用下面的代码时,准确率并没有那么高,在第一个 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 举报,一经查实,本站将立刻删除。