Поэтому я новичок в Encog, и я последовал за входом в Mr.Heaton в 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. Помогите мне, спасибо, спасибо!
Короткий:
Линия
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 6)); //input layer
Должна быть такой
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1)); //input layer
Зачем:
Вы строите основную нейронную сеть и на самом деле Single Layer Perceptron. В качестве вклада вы указываете один возраст возраста и в качестве результата вам требуется один номер, который является уровнем безумия. В вашем коде вы создаете сеть, которая ожидает 6 сигналов в качестве входных данных, но вы предоставили только один возраст, а Encog не знает, какой сигнал должен быть на других 5 нейронах.
Ваша сеть выглядит так:
Я отметил входы без сигнала на красный. Поскольку вы используете только одну переменную, вам нужно уменьшить свой уровень ввода до 1. Еще одна вещь, которая неверна в вашем коде, - это отсутствие нормализации. Вы получаете вход в диапазоне (0-100) и ожидаете выход в диапазоне (0-100). Набор результатов функции сигмоида - это форма от 0 до 1, поэтому перед обучением вашей сети вам необходимо нормализовать набор тренировок. Не забудьте нормализовать вывод, когда вы проверите свою сеть. Вы можете сделать это с помощью NormalizeArray