为未遇到的输入创建神经网络

时间:2015-11-03 09:08:18

标签: machine-learning neural-network time-series aforge supervised-learning

我正在使用AForge.net NN库创建一个简单的多层前馈神经网络。我的NN是使用BackPropogation学习算法通过监督学习方法训练的3层激活网络。

以下是我的初始设置:

//learning rate
learningRate=0.1;

//momentum value
momentum=0;

//alpha value for bipolar sigmoid activation function
sigmoidAlphaValue=2.0;

//number of inputs to network
inputSize=5;

//number of outputs from network
predictionSize=1;

//iterations
iterations=10000;


// create multi-layer neural network
            ActivationNetwork network = new ActivationNetwork(new BipolarSigmoidFunction

(sigmoidAlphaValue), 5, 5 + 1, 3, 1);

//5 inputs
//6 neurons in input layer
//3 neurons in hidden layer
//1 neuron in output layer

// create teacher
BackPropagationLearning teacher = new BackPropagationLearning(network);

// set learning rate and momentum
teacher.LearningRate = learningRate;
teacher.Momentum = momentum;

现在我有一些看起来像这样的输入系列, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

使用窗口滑动方法(如here所述)作为时间序列输入,我的输入和

预期的输出数组看起来像这样

//Iteration #1
double input[][] = new input[0][5] {1,2,3,4,5};
double output[][] = new output[0][0] {6};

//Iteration #2
double input[][] = new input[1][5] {2,3,4,5,6};
double output[][] = new output[1][0] {7};

//Iteration #3
double input[][] = new input[2][5] {3,4,5,6,7};
double output[][] = new output[2][0] {8};
.
.
.
//Iteration #n
double input[][] = new input[n][5] {15,16,17,18,19};
double output[][] = new output[n][0] {20};

使用

进行10k次迭代后
teacher.RunEpoch(input, output);

我的网络已成功培训给定的训练集。所以现在,如果我使用输入计算为4,5,6,7,8,网络成功地给出了9个答案太棒了!

然而,当输入提供为21,22,23,24,25时,NN无法产生26!

我的问题: 如何训练我的网络接受这种无法获得的这种方式的输入,以产生学习过程中训练集中的正确序列模式?

1 个答案:

答案 0 :(得分:4)

正如@runDOSrun所说,你的模型似乎过度拟合(训练)数据。为避免此问题,您可以将您的设置(时间序列)分成3个部分。

训练集

第一个可能是您训练网络的训练集。

验证集

第二个是验证集,其中对于每个训练时期,您在验证集上测试神经网络并获取错误并将此错误存储在神经网络的变量和副本(克隆)中。在下一个时代,您必须测试(修改的)神经网络,如果验证集上的新错误低于您测试的最后一个错误,则存储一个新的验证神经网络"。它将为您提供一个神经网络,在一个不是训练集的集合中更好地概括。所以你要避免过度训练训练集。

训练结束时你有两个神经网络。 训练神经网络是训练集的最佳神经网络和验证神经网络,它可以为你提供一个更好地推广训练集的神经网络。 / p>

测试集

最后一部分,您只是在一个看不见的集合中测试您的模型并检查错误。测试集的建议是在看不见的测试中检查神经网络的行为。真正的考验。

一般情况下,您可以将整个集合整齐为3个等于零件,或者样本

  • 60%用于培训
  • 20%用于验证
  • 20%进行测试

如需样品,请查看下图:

enter image description here

伪代码的示例,说明如何实现它:

int epochs = 1;
double error = 0;
double validationError = 10000;
object validationNetwork;
do
{
    // train your network

    error = getError(trainingSet);

    //validation part...

    var currentValidationError = getError(validationSet);
    if (currentValidationError < validationError)
    {
       validationError = currentValidationError;
       validationNeuralNetwork = neuralNetwork.Clone();
    }

} while (epochs < 2000 && error < 0.001);

时间序列的交叉验证

另一方面,您也可以尝试对时间序列进行交叉验证。首先,您将您的集合分成6个部分(或更多)并训练神经网络以验证模型,如下所示:

  • 1:培训[1],验证[2],测试[3]
  • 2:训练[2],验证[3],测试[4]
  • 3:训练[3],验证[4],测试[5]
  • 4:训练[4],验证[5],测试[6]

如果需要,您可以拆分更多部分。