2014-04-01 65 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';动态网络的'时间'或静态网络的'样本'