我刚刚开始尝试通过复制我发现的一个用 python 编写的简单神经网络在 c# 中创建我自己的神经网络,并且输出总是以 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。
答案 0 :(得分:1)
当然,user219279 的评论是正确的:现在 NN 更好地在 GPU/Tensor 中运行,当您要扩展网络时,速度会快得多。但是,对于 XOR 反向传播和研究,您不需要性能。
0.5 的输出值非常常见,称为“局部最小值”。当您的网络训练由于某种原因无法收敛时,就会发生这种情况。权重达到巨大的 +/- 值,而不是具有小值和 0/1 输出的天平。
我在上面看到的错误:没有足够的权重。您将权重分配为 2x1 数组,连接输入输出。你不能训练只有 2 个权重的 XOR 结果网络。你至少需要 5 个重量。有关合适的 XOR 架构的详细信息,请参阅 http://mnemstudio.org/neural-networks-multilayer-perceptrons.htm