我有一个非常大的训练集,需要进行大规模训练。
是否可以将训练集分成几部分,然后迭代地训练网络,并在每次迭代中更新“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)