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

2024-01-20

我正在使用创建一个简单的多层前馈神经网络锻造网 http://www.aforgenet.com/framework/NN 库。我的神经网络是一个 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 http://www.obitko.com/tutorials/neural-network-prediction/training-set.html)作为时间序列的输入,我的输入和

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

//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 时,神经网络无法生成 26!

我的问题:如何训练我的网络接受这种未遇到的输入,以产生学习过程中训练集中发现的正确序列模式?


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

训练集

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

验证集

第二个是验证集,对于训练的每个时期,您在验证集上测试神经网络并获取错误并将该错误存储在变量和神经网络的副本(克隆)中。在下一个时期,您必须测试(修改后的)神经网络,如果验证集上的新错误低于您测试的最后一个错误,则存储一个新的“验证神经网络”。它将为您提供一个神经网络,该神经网络在非训练集的集合中可以更好地泛化。这样你就可以避免训练集过度拟合。

训练结束时,您将拥有两个神经网络。这训练神经网络这是训练集的最佳神经网络验证神经网络,它可以为您提供一个能够更好地概括训练集的神经网络。

Test Set

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

一般来说,您可以将整个集合分成 3 个相等的部分,或者作为示例

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

例如,请查看下图:

的样本伪代码如何实施它:

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 https://i.stack.imgur.com/7dVdU.png]、验证[2]、测试[3]
  • 2:训练 [2]、验证 [3]、测试 [4]
  • 3:训练 [3]、验证 [4]、测试 [5]
  • 4:训练 [4]、验证 [5]、测试 [6]

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为未遇到的输入创建神经网络 的相关文章

随机推荐

  • 在 S3 存储桶之间移动文件的最佳方式?

    我想每天将一些文件从生产存储桶复制到开发存储桶 例如 复制 Productionbucket feed feedname date 到developmentbucket feed feedname date 由于我想要的文件在文件夹结构中太
  • 多个 RTSP 流不工作

    我在 Activity 中使用了 4 个 VideoView 如果 uri1 可用且其他 uri 不可用 则意味着所有视频视图都显示 uri1 的视频 如果其他 uri 可用但 uri1 未启动 则意味着所有视频视图均未显示任何内容 指导我
  • 打开 Chrome 或 Firefox,无需选项卡和其他菜单项,并设置屏幕位置和大小

    我需要在设定的位置启动 Chrome 或 Firefox 具有设定的大小 并且没有选项卡和其他菜单项 最终目标是一个桌面图标 我可以单击桌面图标以在桌面上的 x y 处获得一个 X 宽 Y 高的窗口 显示特定页面 而无需将这些设置永久保留在
  • vc++ 应用程序中的看门狗

    我写了一个简单的vc 后台应用程序 我正在尝试的就像一个看门狗服务 可以监视应用程序是否正在运行 如果应用程序崩溃 那么服务应该启动应用程序 为了通过 Windows 安装程序创建安装程序 我仅使用 app exe 和 app dll 是否
  • WPF - 绑定到菜单图标

    我有一个包含菜单的用户控件 我需要将 Menu Icon 绑定到 UserControl 的属性 但它不起作用 代码是这样开始的
  • 从可执行文件创建 Windows 服务

    是否有任何快速方法可以根据给定的可执行文件创建 Windows 服务 并在启动时启动它 要从可执行文件创建 Windows 服务 您可以使用sc exe sc exe create
  • Code OSS 和 Visual Studio Code 之间的差异

    正如开发商所说here https github com Microsoft vscode issues 60 issuecomment 161792005 所有这一切的最酷之处在于 您可以选择在我们的许可下使用 Visual Studio
  • 如何实现跨应用导航并导航回Fiori launchpad主页?

    在我们公司 我们建立了 Fiori 启动板 在其中 我们配置了一个链接到自定义开发的 SAPUI5 应用程序的磁贴 该应用程序作为 BSP 部署在服务器上 我们花了很长时间 但使用该应用程序中的路由器模式 我们成功地实现了从启动板磁贴到自定
  • 有没有脚本 SVG 编辑器?

    我想使用某种脚本语言 最好是 Python 编辑 SVG 文件 特别是 我想合并两个 SVG 文件 添加一些注释 并将它们排列在更大的图像中 有没有可用于此类目的的软件 Thanks Bartosz UPDATE 我最终决定使用nosklo
  • 网页字体大小中的px到底代表什么

    我正在做一些图形 在Javascript中 如果相关的话 我知道你可以使用pt px 等查找什么时px这意味着 每个网站似乎都有相同的模糊答案 字体大小 以像素为单位 我想知道什么exactly px代表 例如 如果我有20px 20 像素
  • 尝试与 Web 服务通信时遇到“没有到主机的路由”错误

    我正在尝试与我的笔记本电脑上的网络服务进行通信 并使用 Android 手机作为客户端 我试图做一个简单的登录功能 但是 每当客户端尝试与 Web 服务通信时 Eclipse 上的 DDMS 中就会弹出此错误 我可以通过家庭网络访问网络服务
  • Android 离线语音识别只显示一个结果?

    我已经设置了语音识别服务 如本文所示Android 语音识别作为 Android 4 1 和 4 2 上的服务 https stackoverflow com questions 14940657 android speech recogn
  • 如何使 Jinja2 中的 tojson() 过滤器输出 Unicode 而不是转义序列?

    我的模板是用于JS的 let SETTINGS settings tojson 4 我的设置是一个字典 name Russian name id 12345 如果我渲染它 我会得到 let SETTINGS name Russian nam
  • 使用用户变量访问结构成员

    假设我有一个结构如下 struct person int age char name 24 person 用户给出程序应该读取哪个结构成员的参数 program age int main int argc char argv int i i
  • 使用四边形的重心坐标

    你们中的一些人知道如何使用重心填充二维四边形 坐标 目前 我将四边形分成2个三角形 但这种方式效率低下 因为我必须迭代第二个 边界框重复先前填充的像素 通过 例如 为了填充第二个三角形 我遍历了第一个三角形 属于由第二个三角形形成的边界框
  • Lua 中的 OOP 和事件监听器 (Corona SDK)

    我在 Corona SDK 中的第一步和第一次遇到的麻烦 尝试制作两个盒子 我可以通过以下方式移动它们this http www ludicroussoftware com blog 2011 07 06 simple oop with i
  • 如何将图像列添加到 wicket 框架中的表中?

    我想在 wicket 框架中的表格的每个单元格中添加包含图像的列 我在 java 类中创建表格 并有一个 createColumns 方法 如下所示 private List
  • 当“if else”/“instance of”不可避免时,除了使用访问者模式之外,我们如何改进设计?

    当我们有一个纯粹是语义继承而不是行为继承的对象层次结构时 我们不可避免地需要到处编写 instanceof 或 if else 来进行运行时类型检查 E g 如果我有一个对象层次结构 Class Function Class Average
  • 绘图加载时禁用闪亮按钮

    加载绘图 反应元素时是否可以禁用闪亮的按钮 我知道shinyjs可以禁用和启用输入元素 但我不知道如何设置与加载图 反应元素的连接 该示例基于单文件闪亮应用程序页面 https shiny rstudio com articles sing
  • 为未遇到的输入创建神经网络

    我正在使用创建一个简单的多层前馈神经网络锻造网 http www aforgenet com framework NN 库 我的神经网络是一个 3 层激活网络 使用反向传播学习算法通过监督学习方法进行训练 以下是我的初始设置 learnin