[英]C# Math.Net Matrix dimensions must agree
我试图在C#中翻译神经网络的这个python代码https://gist.github.com/miloharper/c5db6590f26d99ab2670#file-main-py 。 我正在使用Math.Net Numerics作为矩阵,这是我迄今为止在C#中创建的代码
using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra.Double;
namespace NeuralNetwork
{
class Program
{
static void Main(string[] args)
{
NeuralNetwork NN = new NeuralNetwork();
Console.WriteLine("Random starting synaptic weights: ");
Console.WriteLine(NN.SynapticWeights);
Matrix<double> TrainingSetInput = DenseMatrix.OfArray(new double[,] { { 0, 0, 1 }, { 1, 1, 1 }, { 1, 0, 1 }, { 0, 1, 1 } });
Matrix<double> TrainingSetOutput = DenseMatrix.OfArray(new double[,] { { 0, 1, 1, 0 } }).Transpose();
NN.Train(TrainingSetInput, TrainingSetOutput, 10000);
Console.WriteLine("New synaptic weights after training: ");
Console.WriteLine(NN.SynapticWeights);
Console.WriteLine("Considering new situation {1, 0, 0} -> ?: ");
Console.WriteLine(NN.Think(DenseMatrix.OfArray(new double[,] { { 1, 0, 0 } })));
Console.ReadLine();
}
}
class NeuralNetwork
{
private Matrix<double> _SynapticWeights;
public NeuralNetwork()
{
_SynapticWeights = 2 * Matrix<double>.Build.Random(3, 1) - 1;
}
private Matrix<double> Sigmoid(Matrix<double> Input)
{
return 1 / (1 + Matrix<double>.Exp(-Input));
}
private Matrix<double> SigmoidDerivative(Matrix<double> Input)
{
return Input * (1 - Input); //NEW Exception here
}
public Matrix<double> Think(Matrix<double> Input)
{
return Sigmoid((Input * _SynapticWeights)); //Exception here (Solved)
}
public void Train(Matrix<double> TrainingInput, Matrix<double> TrainingOutput, int TrainingIterations)
{
for (int Index = 0; Index < TrainingIterations; Index++)
{
Matrix<double> Output = Think(TrainingInput);
Matrix<double> Error = TrainingOutput - Output;
Matrix<double> Adjustment = Matrix<double>.op_DotMultiply(TrainingInput.Transpose(), Error * SigmoidDerivative(Output));
_SynapticWeights += Adjustment;
}
}
public Matrix<double> SynapticWeights { get { return _SynapticWeights; } set { _SynapticWeights = value; } }
}
}
当我执行它时,它在第53行显示一个异常(代码中的那一行有一条注释)。 它说:
矩阵尺寸必须一致:op1为4x3,op2为3x1
我错误地复制了它还是MAth.Net库有问题?
提前致谢
据我所见,问题不在库代码中。 您正尝试使用op_DotMultiply
函数执行逐元素矩阵乘法(第53行)。 在这种情况下,从错误消息中可以明显看出,由于尺寸不同,矩阵不能相乘:第一个是4x3,第二个是3x1。
我可以建议看一下这些矩阵的大小: TrainingSetInput
和_SynapticWeights
(看看函数Train
,你在里面调用了Think
大小错误的矩阵)。 检查它们是否正确生成。 并且还要考虑是否真的需要元素矩阵乘法或通常的乘法。 如果您需要有关矩阵乘法的更多信息,可以使用以下链接:
元素: https : //en.wikipedia.org/wiki/Hadamard_product_(matrix)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.