我正在创建一个简单的多层前馈神经网络使用AForge.net神经网络库.我的神经网络是利用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
使用窗口滑动法(如描述的这里)作为时间序列输入,我的输入和
预期的输出数组如下所示
//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!
我的问题:如何训练我的网络来接受这种方式中没有遇到的输入,从而产生一个正确的序列模式,就像在学习过程中的训练集中所发现的那样?
发布于 2015-11-04 11:16:20
正如@runDOSrun所说,您的模型似乎过分适合(培训)数据。为了避免这个问题,您可以将集合(时间序列)分成3部分。
训练集
第一个可能是你只是训练你的网络的训练集。
验证集
第二种是验证集,在每一个训练时代,您在验证集上测试神经网络,并接受错误并将此错误存储在一个变量和一个神经网络(克隆)副本中。在下一个时代,您必须测试(修改的)神经网络,如果验证集上的新错误低于您上次测试的错误,则存储一个新的“验证神经网络”。它将为您提供一个神经网络,它更好地概括在一个集合,而不是训练集。所以你要避免过度适应训练集。
在训练结束时,你有两个神经网络。训练神经网络是训练集的最佳神经网络,也是验证神经网络,它可以为你提供一个神经网络,它能更好地概括出训练集。
测试集
最后一部分,您只需在一个看不见的集合中测试您的模型并检查错误。测试集的提出是为了检查神经网络在未见测试中的行为。真正的考验。
通常,您可以将整个集合按3等份滑动,也可以用于示例。
对于示例,请查看下面的图像:

如何实现伪代码的示例:
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部分(或更多),并训练神经网络来验证模型,如下所示:
如果你想的话,你可以分成更多的部分。
https://stackoverflow.com/questions/33495127
复制相似问题