Neural network 前馈反向传播神经网络中的权值不变

Neural network 前馈反向传播神经网络中的权值不变,neural-network,artificial-intelligence,backpropagation,feed-forward,Neural Network,Artificial Intelligence,Backpropagation,Feed Forward,我正在设计一个具有22个输入和1个输出(1或0)的前馈反向传播ANN。神经网络有3层,使用10个隐藏的神经元。当我运行NN时,它只改变了一点点权重,输出的总误差约为40%。起初,我认为这是过度/不合适的,但在我改变了隐藏神经元的数量后,一切都没有改变 N是输入的数量(22) M是隐藏神经元的数量(10) 这是我用来反向传播的代码 oin是输入sigmoid函数前计算的输出 double odelta = sigmoidDerivative(oin) * (TARGET_VALUE1[i] - o

我正在设计一个具有22个输入和1个输出(1或0)的前馈反向传播ANN。神经网络有3层,使用10个隐藏的神经元。当我运行NN时,它只改变了一点点权重,输出的总误差约为40%。起初,我认为这是过度/不合适的,但在我改变了隐藏神经元的数量后,一切都没有改变

N是输入的数量(22)

M是隐藏神经元的数量(10)

这是我用来反向传播的代码

oin是输入sigmoid函数前计算的输出

double odelta = sigmoidDerivative(oin) * (TARGET_VALUE1[i] - oout);
    double dobias = 0.0;
    double doweight[] = new double[m];

    for(int j = 0; j < m; j++)
    {
        doweight[j] = (ALPHA * odelta * hout[j]) + (MU * (oweight[j] - oweight2[j]));
        oweight2[j] = oweight[j];
        oweight[j] += doweight[j];
    } // j

    dobias = (ALPHA * odelta) + (MU * (obias - obias2));
    obias2 = obias;
    obias += dobias;

    updateHidden(N, m, odelta);
oot是经过sigmoid函数后的输出

double odelta = sigmoidDerivative(oin) * (TARGET_VALUE1[i] - oout);
    double dobias = 0.0;
    double doweight[] = new double[m];

    for(int j = 0; j < m; j++)
    {
        doweight[j] = (ALPHA * odelta * hout[j]) + (MU * (oweight[j] - oweight2[j]));
        oweight2[j] = oweight[j];
        oweight[j] += doweight[j];
    } // j

    dobias = (ALPHA * odelta) + (MU * (obias - obias2));
    obias2 = obias;
    obias += dobias;

    updateHidden(N, m, odelta);
double-odelta=sigmoidevivative(oin)*(目标值1[i]-oout);
双多比亚=0.0;
双倍重量[]=新的双倍重量[m];
对于(int j=0;j
这是我用来改变隐藏神经元的代码

 for(int j = 0; j < m; j++)
        {
            hdelta = (d * oweight[j]) * sigmoidDerivative(hin[j]);

            for(int i = 0; i < n; i++)
            {
                dhweight[i][j] = (ALPHA * hdelta * inputNeuron[i]) + (MU * (hweight[i][j] - hweight2[i][j]));
                hweight2[i][j] = hweight[i][j];
                hweight[i][j] += dhweight[i][j];


            } 

            dhbias[j] = (ALPHA * hdelta) + (MU * (hbias[j] - hbias2[j]));
            hbias2[j] = hbias[j];
            hbias[j] += dhbias[j];
        } `
for(int j=0;j
您正在学习网络在一个节点上输出两个类。连接到该网络的权重适应于预测单个类别,然后预测另一个类别。因此,大多数情况下,您的权重都是根据数据中的主导类进行调整的。为避免出现此问题,请添加另一个节点,使输出上有两个节点,每个节点引用一个类

如何初始化权重?你能给我们提供更多关于如何更新和初始化你的网络的代码吗?我通过在-1和1之间随机分配权重来初始化它。我该怎么做呢?我只是在学习安,我不太确定我是否理解你的答案。你说的两节课是什么意思?