1

我有非常大的火車集,以便Matlab。我需要做大規模的訓練。如何在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 
+0

如何ÿ你知道它是覆蓋而不是更新嗎?你能展示一些數據的例子,因爲我不太明白你的意思,「在每次迭代中,它只根據訓練的數據集更新網絡。」?謝謝 – lennon310

+0

我在時間序列中使用神經網絡來預測多點(90)。如果我使用train(),則在每次迭代時它會覆蓋已經訓練好的部分。我通過比較我的預測值和實際值來觀察它。到時候沒有任何改善,我的預測僅基於訓練的小部分數據。我認爲,不是訓練1,000,000個數據點,而是以迭代方式訓練它。 目前我正在嘗試adapt()函數,但是我看不到我的預測有任何改進。這是我的問題//是否可以使用adapt()。 謝謝。 – Alper

+0

預測僅基於訓練的數據。在我的每次迭代訓練中,我都無法看到以前訓練過的數據的模式或行爲。 – Alper

回答

1

這裏的如何在MATLAB訓練NN迭代(小批量)的例子:

只需創建一個玩具集

[ x,t] = building_dataset; 

minibatch大小和數量

M = 420 
imax = 10; 

讓檢查直接培訓VS minibatch培訓

net = feedforwardnet(70,'trainscg'); 
dnet = feedforwardnet(70,'trainscg'); 
這裏0

標準的培訓: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)))) 

這是迭代的一部分:每次呼叫

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) 
+0

歡迎使用Stack Overflow,並感謝您的提交!爲了幫助我們爲最多的程序員提供一個良好的資源,能否請您更新您的答案,並解釋爲什麼這是一個很好的解決方案? – gariepy

2

我有沒有機會來看看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個訓練集STD值,其餘全部):

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=[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];

測試表現良好以上表示訓練是基於以前的網絡而不是重新啓動。性能惡化的原因是您僅對每個數據塊執行一次(隨機梯度下降而不是批梯度下降),因此總誤差曲線可能尚未收斂。假設你只有兩個數據塊,你可能需要在完成訓練塊2之後重新訓練塊1,然後重新訓練塊2,然後塊1,等等,直到滿足一些條件。如果你有更多的組塊,與第一次訓練效果相比,你可能不需要擔心第二組。無論最新的權重是否影響其性能,在線學習都會丟棄之前的數據集。

+0

感謝您的回覆。在我的情況下,我有一個非常大的數據集,我的目標是預測90分。在那種情況下,我有輸入值和輸出點。例如,當我訓練最初的1000個數據,直到它達到95%以上的最小誤差。經過訓練後,當我對第二部分數據做了同樣的處理時,它會覆蓋重量和預測變量,主要表現爲數據的最新列車部分。我無法想出解決這個問題的辦法。在迭代訓練中,我應該保持小的學習率和#ofepochs。 謝謝。 – Alper

+0

對於每次迭代訓練的部分數據,我總是試圖保留它,直到訓練數據達到> 90%的準確度。 – Alper

+0

而不是第一次訓練,我正在做適應()。我嘗試了你的建議,但不幸的是我看不到任何改進。作爲首列訓練的證明,訓練數據完全適合,但在訓練接下來的1000個數據部分之後,突然之前適應的數據將不再適合。預測的行爲仍然關注迭代中最後訓練的數據部分,並且它完全忽略已經訓練過的部分數據。什麼應該是適應()函數的最佳阿爾法(學習率)/對於trainSamples.P下的while,trainSamples.T應該只是它的訓練樣本塊? – Alper