【发布时间】:2021-01-19 18:50:50
【问题描述】:
我刚开始尝试通过复制一个我发现的用 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。
【问题讨论】:
-
我认为大多数进入 NN 的人不再从头开始编写代码,我曾经这样做过,但我不再这样做了,你最好花时间在 pytorch / tensorflow 上。在那里你使用管道。输入层隐藏层,输出层学习 RELU 等。(如果你想深入研究,我认为那是更好的时间)
-
啊,好吧,我明白了,所以您认为即使是初学者也更值得与之合作和学习?
-
特别是作为初学者,让神经网络做一些实际有趣的事情会更有意义它是免费的。
标签: c# machine-learning neural-network