簡體   English   中英

如何在Matlab中逐步訓練神經網絡? 並迭代地組合它們

[英]How to train neural network incrementally in Matlab? and iteratively combine them

我有非常大的火車設置,所以Matlab。 我需要做大規模的培訓。

是否有可能將訓練集分成幾部分並迭代訓練網絡,並在每次迭代時更新“網”而不是覆蓋它?

下面的代碼顯示了這個想法,它不會起作用。 在每次迭代中,它根據唯一訓練的數據集更新網絡。

TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';% layers of the transfer function , TF3 transfer function for the output layers

net = newff(trainSamples.P,trainSamples.T,[NodeNum1,NodeNum2,NodeOutput],{TF1 TF2 TF3},'traingdx');% Network created

net.trainfcn = 'traingdm' ; %'traingdm';
net.trainParam.epochs   = 1000;
net.trainParam.min_grad = 0;
net.trainParam.max_fail = 2000; %large value for infinity

while(1) // iteratively takes 10 data point at a time.
 p %=> get updated with following 10 new data points
 t %=> get updated with following 10 new data points

 [net,tr]             = train(net, p, t,[], []);

end

我還沒有機會看看adapt功能,但我懷疑它是更新而不是覆蓋。 要驗證此語句,您可能需要選擇第一個數據塊的子集作為訓練中的第二個塊。 如果它被覆蓋,當您使用帶有子集的訓練網來測試您的第一個數據塊時,應該很難預測那些不屬於該子集的數據。

我用一個非常簡單的程序測試它:訓練曲線y=x^2 在第一次培訓過程中,我學習了數據集[1,3,5,7,9]

   m=6;
   P=[1 3 5 7 9];
   T=P.^2;
   [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);
   clear net
   net.IW{1,1}=zeros(m,1);
   net.LW{2,1}=zeros(1,m);
   net.b{1,1}=zeros(m,1);
   net.b{2,1}=zeros(1,1);
   net=newff(minmax(Pn),[m,1],{'logsig','purelin'},'trainlm');
   net.trainParam.show =100;
   net.trainParam.lr = 0.09;
   net.trainParam.epochs =1000;
   net.trainParam.goal = 1e-3; 
   [net,tr]=train(net,Pn,Tn);
   Tn_predicted= sim(net,Pn)
   Tn

結果(請注意,輸出使用相同的參考進行縮放。 如果您正在進行標准規范化,請確保始終將第1次訓練集中的均值和標准值應用於所有其余值 ):

Tn_predicted =

   -1.0000   -0.8000   -0.4000    0.1995    1.0000


Tn =

   -1.0000   -0.8000   -0.4000    0.2000    1.0000

現在我們正在實施第二個培訓過程,其中包括培訓數據[1,9]

   Pt=[1 9];
   Tt=Pt.^2;
   n=length(Pt);
   Ptn = tramnmx(Pt,minP,maxP);
   Ttn = tramnmx(Tt,minT,maxT);


   [net,tr]=train(net,Ptn,Ttn);
   Tn_predicted= sim(net,Pn)
   Tn

結果:

Tn_predicted =

   -1.0000   -0.8000   -0.4000    0.1995    1.0000


Tn =

   -1.0000   -0.8000   -0.4000    0.2000    1.0000

注意x=[3,5,7];的數據x=[3,5,7]; 仍然是精確預測的。

但是,如果我們只訓練x=[1,9]; 從一開始就:

   clear net
   net.IW{1,1}=zeros(m,1);
   net.LW{2,1}=zeros(1,m);
   net.b{1,1}=zeros(m,1);
   net.b{2,1}=zeros(1,1);
   net=newff(minmax(Ptn),[m,1],{'logsig','purelin'},'trainlm');
   net.trainParam.show =100;
   net.trainParam.lr = 0.09;
   net.trainParam.epochs =1000;
   net.trainParam.goal = 1e-3; 
   [net,tr]=train(net,Ptn,Ttn);
   Tn_predicted= sim(net,Pn)
   Tn

觀察結果:

Tn_predicted =

   -1.0071   -0.6413    0.5281    0.6467    0.9922


Tn =

   -1.0000   -0.8000   -0.4000    0.2000    1.0000

注意訓練好的網在x=[3,5,7];上表現不佳x=[3,5,7];

上述測試表明,培訓基於之前的網絡,而不是重新開始。 你性能更差的原因是你只為每個數據塊實現一次(隨機梯度下降而不是批量梯度下降),因此總誤差曲線可能還沒有收斂。 假設您只有兩個數據塊,您可能需要在完成訓練塊2之后重新訓練塊1,然后重新訓練塊2,然后重新訓練塊1,依此類推,直到滿足某些條件。 如果你有更多的塊,你可能不需要擔心第二訓練效果。 無論更新的權重是否會影響其性能,在線學習都會刪除以前的數據集。

這里是一個如何在matlab中迭代地訓練NN(迷你批處理)的例子:

只需創建一個玩具數據集

[ x,t] = building_dataset;

小批量大小和數量

M = 420 
imax = 10;

讓我們檢查直接培訓與小批量培訓

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

這里的標准培訓:1個單一呼叫與整個數據

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

一種誤差:MEA,易於測量MSE或任何其他您想要的

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

這是迭代部分:每次調用1個紀元

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

直到我們達到之前的方法錯誤,進行時代比較

while perf(end)>dperf

在每個時代隨機化數據非常重要!!

    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

計算每個時代的表現

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

檢查性能,我們想要一個很好的准平滑和exp(-x)之類的曲線

plot(perf)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM