如何在Matlab中增量训练神经网络并迭代合并它们

我有一个非常大的训练集,需要进行大规模训练。

是否可以将训练集分成几部分,然后迭代地训练网络,并在每次迭代中更新“net”,而不是覆盖它?

下面的代码展示了这个想法,但它不会工作。在每次迭代中,它仅根据已训练的数据集更新网络。

TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';% 传输函数的层,TF3 是输出层的传输函数net = newff(trainSamples.P,trainSamples.T,[NodeNum1,NodeNum2,NodeOutput],{TF1 TF2 TF3},'traingdx');% 创建网络net.trainfcn = 'traingdm' ; %'traingdm';net.trainParam.epochs   = 1000;net.trainParam.min_grad = 0;net.trainParam.max_fail = 2000; % 设为一个大值以表示无穷大while(1) // 每次迭代取10个数据点。 p %=> 用接下来的10个新数据点更新 t %=> 用接下来的10个新数据点更新 [net,tr]             = train(net, p, t,[], []);end

回答:

以下是如何在Matlab中迭代训练神经网络(小批量)的示例:

创建一个玩具数据集

[ x,t] = building_dataset;

小批量大小和数量

M = 420 imax = 10;

让我们比较直接训练与小批量训练

net = feedforwardnet(70,'trainscg');dnet = feedforwardnet(70,'trainscg');

标准训练:一次调用使用所有数据

dnet.trainParam.epochs=100;[ dnet tr y ] = train( dnet, x, t ,'useGPU','only','showResources','no');

错误度量:MEA,可以轻松测量MSE或任何其他你想要的度量

dperf = mean(mean(abs(t-dnet(x))))

这是迭代部分:每次调用一个epoch

net.trainParam.epochs=1;e=1;

直到达到之前方法的错误,以便比较epoch

while perf(end)>dperf

非常重要的是在每个epoch随机化数据!!

    idx = randperm(size(x,2));

用所有数据块迭代训练

    for i=1:imax        k = idx(1+M*(i-1) : M*i);        [ net tr ] = train( net, x( : , k ), t( : , k ) );    end

计算每个epoch的性能

    perf(e) = mean(mean(abs(t-net(x))))    e=e+1;end

检查性能,我们希望得到一个类似于准平滑和exp(-x)的曲线

plot(perf)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注