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

无论我输入什么内容,我编写的简单C#神经网络都将为XOR问题输出相似的结果

如何解决无论我输入什么内容,我编写的简单C#神经网络都将为XOR问题输出相似的结果

我已经编写了一个简单的神经网络,目前正在测试XOR问题(我知道我的代码可能效率不高,但是我只是想了解NN的工作方式)。但是,用我的Trainstochastic方法进行训练后,网络为所有可能的输入输出了非常相似的结果。 例如

Input: [0f,0f],Output: 0.934f
Input: [0f,1f],Output: 0.938f
Input: [1f,Output: 0.931f

我正在训练的批次数量为5(随机选择5组可能的XOR输入),共200批次。我的激活功能是乙状结肠功能,我的学习率是0.05。我已经尝试过对所有这些进行调整,但神经网络似乎仍在继续这样做,这使我相信自己的训练方法有问题。方法是:

public void Trainstochastic(TrainingData inputBatches)
    {
        Matrix[] deltaBiasMatrices = new Matrix[biasMatrices.Length];
        Matrix[] deltaWeightMatrices = new Matrix[weightMatrices.Length];

        foreach ((Matrix input,Matrix desiredOutput)[] inputBatch in inputBatches.data)
        {
            for (int i = 0; i < errorMatrices.Length; i++)
            {
                deltaBiasMatrices[i] = new Matrix(biasMatrices[i].Rows,biasMatrices[i].Cols);
                deltaBiasMatrices[i].InitializeWithValues(0f);
                deltaWeightMatrices[i] = new Matrix(weightMatrices[i].Rows,weightMatrices[i].Cols);
                deltaWeightMatrices[i].InitializeWithValues(0f);
            }
            foreach ((Matrix input,Matrix desiredOutput) trainingExample in inputBatch)
            {
                Matrix output = FeedForward(trainingExample.input);

                // Output Error
                errorMatrices[^1] = Matrix.HadamardProduct(Matrix.Subtract(trainingExample.desiredOutput,output),Matrix.Evaluate(preActivationMatrices[^1],dActivator));

                // Backprop Error
                for (int l = errorMatrices.Length - 2; l >= 0; l--)
                {
                    errorMatrices[l] = Matrix.HadamardProduct(Matrix.Multiply(Matrix.Transpose(weightMatrices[l + 1]),errorMatrices[l + 1]),Matrix.Evaluate(preActivationMatrices[l],dActivator));
                }

                // Adjust weights and biases
                deltaBiasMatrices[0].Add(errorMatrices[0]);

                for (int i = 0; i < deltaWeightMatrices[0].Rows; i++)
                {
                    for (int j = 0; j < deltaWeightMatrices[0].Cols; j++)
                    {
                        deltaWeightMatrices[0][i,j] += errorMatrices[0][i] * activator(trainingExample.input[j]);
                    }
                }
                for (int l = 1; l < errorMatrices.Length; L++)
                {
                    deltaBiasMatrices[l].Add(errorMatrices[l]);

                    for (int i = 0; i < deltaWeightMatrices[l].Rows; i++)
                    {
                        for (int j = 0; j < deltaWeightMatrices[l].Cols; j++)
                        {
                            deltaWeightMatrices[l][i,j] += errorMatrices[l][i] * activationMatrices[l - 1][j];
                        }
                    }
                }
            }
            for (int i = 0; i < deltaBiasMatrices.Length; i++)
            {
                deltaBiasMatrices[i].Scale(-LearningRate / inputBatch.Length);
                deltaWeightMatrices[i].Scale(-LearningRate / inputBatch.Length);
                biasMatrices[i].Add(deltaBiasMatrices[i]);
                weightMatrices[i].Add(deltaWeightMatrices[i]);
            }
        }
    }
}

训练数据被组织成一个(Matrix input,Matrix desiredOutput)元组组成的锯齿状数组,其中每个数组TrainingData.data[i]是一批带标签的输入。我已经测试了Matrix类,并且相当有信心该错误不在其中。 任何关于为什么它不起作用的想法将不胜感激, 谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。