我刚开始尝试用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