XOR神经网络误差持续收敛到0.5

我刚开始尝试用C#编写自己的神经网络,参考了一个用Python编写的简单网络,结果输出总是停留在0.5。我查看了Google上关于此问题的其他提问,但没有找到适用的解决方案。我不知道为什么会这样。以下是目前我的代码样子:

public class NeuralNetwork        {            private double[,] w;            public NeuralNetwork()            {                w = random(2, 1);            }            public double[,] getWeights()            {                return w;            }            public void train(double[,] x, double[,] y, int iterations)            {                for (int i = 0; i < iterations; i++)                {                    double[,] output = think(x);                    double[,] error = Mat.subtract(Mat.transpose(y), output);                    double[,] adjust = dot(Mat.transpose(x), Mat.multiply(error, doSigDeriv(output)));                    w = Mat.add(w, adjust);                }            }            public double[,] think(double[,] inputs)            {                return doSig(dot(inputs, w));            }            private double[,] dot(double[,] a, double[,] b)            {                double[,] dot = new double[a.GetLength(0), b.GetLength(1)];                for (int i = 0; i < a.GetLength(0); i++)                {                    for (int j = 0; j < b.GetLength(1); j++)                    {                        for (int k = 0; k < b.GetLength(0); k++)                            dot[i, j] += a[i, k] * b[k, j];                    }                }                return dot;            }            private double[,] random(int w, int h)            {                double[,] a = new double[w, h];                for (int i = 0; i < w; i++)                {                    for (int j = 0; j < h; j++)                    {                        a[i, j] = 2 * (double)rand.NextDouble() - 1;                    }                }                return a;            }            private double[,] doSig(double[,] a)            {                double[,] b = new double[a.GetLength(0), a.GetLength(1)];                for (int i = 0; i < a.GetLength(0); i++)                {                    for (int j = 0; j < a.GetLength(1); j++)                    {                        b[i, j] = sig(a[i, j]);                    }                }                return b;            }            private double[,] doSigDeriv(double[,] a)            {                double[,] b = new double[a.GetLength(0), a.GetLength(1)];                for (int i = 0; i < a.GetLength(0); i++)                {                    for (int j = 0; j < a.GetLength(1); j++)                    {                        b[i, j] = a[i, j] * (1 - a[i, j]);                    }                }                return b;                //return Mat.multiply(a, Mat.subtract(one(a), a));            }            private double sig(double x)            {               return 1 / (double)(1 + Math.Exp(-x));            }        }

x是我用于输入的数组,y用于输出,Mat是我创建的一个用于处理矩阵运算的类。当我测试时,我将迭代次数改为10000和50000,结果还是一样。任何见解都将不胜感激,谢谢。

编辑:我刚意识到,当它应该是0时,它是-0.5,而1是0.5。


回答:

当然,用户的评论是正确的:现在的NN最好在GPU/Tensor上运行,这在你打算扩展你的网络时会快得多。然而,对于XOR反向传播和学习,你不需要性能上的考虑。

输出值为0.5的情况非常常见,被称为“局部最小值”。当你的网络训练无法收敛时就会发生这种情况。权重会达到巨大的正负值,而不是保持小值和0/1的输出平衡。

我看到的错误是:权重不够。你分配的权重是一个2×1的数组,连接输入和输出。仅用2个权重是无法训练一个XOR结果网络的。你至少需要5个权重。有关适合的XOR架构的更多信息,请参见http://mnemstudio.org/neural-networks-multilayer-perceptrons.htm

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注