1

所以我是 Encog 的新手,我按照 Mr.Heaton 对 Encog in C# 的介绍进行了尝试。我的简单练习是开发一个网络,根据一个人的年龄预测他们的“精神错乱程度”,我提供了一个训练集。但是,我发现自己面临这个问题:

“输入层大小 6 必须匹配训练输入大小 1。”

我确定我在某处犯了一个重大错误,这是我的简单代码。

public static double[][] InsanityInput = 
{
     //age
     new double[1]{20},
     new double[1]{25},
     new double[1]{30},
     new double[1]{35},
     new double[1]{40},
     new double[1]{45}
};   
public static double[][] InsanityIDEAL = 
{
     //insanity level
     new double[1]{100},
     new double[1]{90},
     new double[1]{75},
     new double[1]{60},
     new double[1]{30},
     new double[1]{20}
};

static void Main(string[] args)
{
     BasicNetwork network = new BasicNetwork();
     network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 6)); //input layer
     network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 6)); //hidden layer
     network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1)); //output layer
     network.Structure.FinalizeStructure();
     network.Reset();
     INeuralDataSet trainingSet = new BasicNeuralDataSet(InsanityInput, InsanityIDEAL);
     ITrain train = new ResilientPropagation(network, trainingSet);

     int epoch = 1;
     do
     {
         train.Iteration();
         Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error);
         epoch++;
     } while((epoch<5000)&&(train.Error > 0.001));

     double[] inputArray = {27}; //input the age
     INeuralData inputData = new BasicNeuralData(inputArray);
     INeuralData outputData = network.Compute(inputData);
     Console.WriteLine("\nNetwork Prediction: " + outputData.ToString());

     Console.ReadKey();
 }

实际上,这与 Mr.Heaton 在教程中讨论的代码相同。请帮帮我,谢谢!

4

1 回答 1

2

短的:

线

  network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 6)); //input layer

应该是这样的

  network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1)); //input layer

为什么:

您正在构建基本的神经网络,实际上是Single Layer Perceptron。作为输入,您提供一个值age作为输出,您需要一个数字,即insanity level。在您的代码中,您创建了期望 6 个信号作为输入的网络,但您只提供了一个年龄,并且 Encog 不知道其他 5 个神经元上应该是什么信号。

您的网络如下所示:

错误的图表

我将没有信号的输入标记为红色。因为您只需要一个变量,您需要将输入层减少到 1。代码中的另一个错误是缺乏规范化。您在 (0-100) 范围内获得输入,并期望在 (0-100) 范围内输出。Sigmoid 函数结果集是从 0 到 1 的形式,因此在训练您的网络之前,您需要对训练集进行归一化。记住在测试网络时标准化输出。你可以用NormalizeArray做到这一点

于 2014-10-30T08:45:32.310 回答