首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为非遇到的输入建立神经网络

为非遇到的输入建立神经网络
EN

Stack Overflow用户
提问于 2015-11-03 09:08:17
回答 1查看 656关注 0票数 2

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

以下是我的初步设置:

代码语言:javascript
复制
//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

使用窗口滑动法(如描述的这里)作为时间序列输入,我的输入和

预期的输出数组如下所示

代码语言:javascript
复制
//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迭代之后,使用

代码语言:javascript
复制
teacher.RunEpoch(input, output);

我的网络已经成功地为给定的培训集进行了培训。现在,如果我用输入4,5,6,7,8来计算,网络成功地给出了9的答案,非常棒!

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

我的问题:如何训练我的网络来接受这种方式中没有遇到的输入,从而产生一个正确的序列模式,就像在学习过程中的训练集中所发现的那样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-04 11:16:20

正如@runDOSrun所说,您的模型似乎过分适合(培训)数据。为了避免这个问题,您可以将集合(时间序列)分成3部分。

训练集

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

验证集

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

在训练结束时,你有两个神经网络。训练神经网络是训练集的最佳神经网络,也是验证神经网络,它可以为你提供一个神经网络,它能更好地概括出训练集。

测试集

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

通常,您可以将整个集合按3等份滑动,也可以用于示例。

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

对于示例,请查看下面的图像:

如何实现伪代码的示例:

代码语言:javascript
复制
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

如果你想的话,你可以分成更多的部分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33495127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档