2014-04-01 97 views
1

我正在做的時間序列預測與Matlab的神經網絡工具箱使用層的經常性網絡(layrecnet)與layerDelays = 1:2hiddenSize = 5(我已經使用其他幾個大小爲一個隱藏層類似的結果)。我修改了網絡採取多個輸入(最多5或10)和相關的更改爲net.inputConnect,它的工作原理(也就是說,我可以訓練它有很好的結果)。Matlab神經網絡 - 除法作爲divideFcn

只要我改變divideFcn從默認到divideblock它不再工作,給我這個錯誤在運行train功能:

Error in divideblock>divide_indices (line 108) 
    testInd = (1:numTest)+valInd(end); 

Error in divideblock (line 65) 
    [out1,out2,out3] = divide_indices(in1,params); 

Error in nntraining.setup (line 176) 
     [trainInd,valInd,testInd] = 
     feval(net.divideFcn,Q,net.divideParam); 

Error in network/train (line 292) 
    [net,rawData,tr,err] = 
    nntraining.setup(net,net.trainFcn,X,Xi,Ai,T,EW,~isGPUArray); 

通過調試模式下,我發現valInd是一個空數組,這由(內置)nntraining.setup()函數中的值Q確定。 Q由我無法訪問的另一個函數(nntraining.config)設置。現在,顯然我不認爲這些函數中存在錯誤,但我試圖通過追溯問題來找出錯誤。現在我在牆上。

這可以歸結爲兩個問題

  1. 我想用divideblock代替dividerand因爲我想層延遲利用信號的時間結構的(這是高度週期性 - 時腿關節角度步行)。我錯認爲dividerand將無法​​利用這個時間結構?

  2. train函數是如何與divideblock交互的,這意味着我需要改變一些關於我的數據格式的內容嗎?

非常感謝!

回答

2

問題出在網絡的divideMode參數。靜態網絡的默認值爲'sample',動態網絡爲'time'。我還沒有找到兩者之間區別的明確解釋,但是當我初始化一個layrecnet(一個層次遞歸網絡,假設是一個動態網絡)時,它將初始化爲'sample'而不是'time'。因此,它沒有將數據分成訓練,驗證和測試集,而是對整個輸入進行了培訓。在安裝過程中手動更改該值可解決問題。

從工具箱文檔:

該屬性定義了目標數據的尺寸時,數據分割函數被調用,其瓜分。

就時間序列數據而言,這似乎與跨時間和跨期試驗的分裂相關,可以這麼說。也就是說,如果數據是作爲一組並行試驗輸入的(「併發」和「順序」是用於NN輸入的數據類型)並且divideMode被設置爲'sample',它將選擇用於訓練vs.驗證的試驗的子集vs測試。如果有人看到這個,可以提供更清晰的解釋,請做。

+0

感謝您記錄您的答案;我遇到過同樣的問題。 – mhopeng

0

對於動態網絡(如layrecnet)應該使用此代碼爲塊數據分割:

net.divideFcn = 'divideblock'; %使用指數塊將目標分成三組

net.divideParam.trainRatio = 0.6;培訓目標比例。默認值= 0.7。

net.divideParam.valRatio = 0.2; %驗證目標比例。默認= 0.15。

net.divideParam.testRatio = 0.2; %測試目標比例。默認= 0.15。

net.divideMode ='time';動態網絡的'時間'或靜態網絡的'樣本'