所以我是Encog的新手,我跟着Heaton先生介绍了C#中的Encog并尝试了一下。我的简单练习是开发一个网络,根据他们的年龄预测一个人的“疯狂程度”,我提供了一套训练集。但是,我发现自己面临着这个问题:
“输入图层大小为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教程中讨论的代码相同。请帮帮我,谢谢!
答案 0 :(得分:1)
<强>短强>
行
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 6)); //input layer
应该喜欢这样
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1)); //input layer
<强>为什么:强>
您正在建立基本的神经网络,事实上Single Layer Perceptron。作为输入,您提供一个值 age ,作为输出,您需要一个疯狂等级的数字。在您的代码中,您创建的网络需要6个信号作为输入,但您只提供了一个 age ,而Encog不知道其他5个神经元上应该有什么信号。
您的网络如下所示:
我将没有信号的输入标记为红色。因为您只需要一个变量,所以需要将输入图层减少到1。 你的代码中另一个错误的是缺少normalization。您可以在范围(0-100)中获得输入,并期望输出范围(0-100)。 Sigmoid function结果集的格式为0到1,因此在训练网络之前,您需要规范化训练集。在测试网络时,请记住规范化输出。你可以NormalizeArray
来做