Matlab神经网络 - 将分块作为divideFcn的麻烦

时间:2014-04-01 06:59:34

标签: matlab neural-network

我使用带有layrecnetlayerDelays = 1:2的层复现网络(hiddenSize = 5),使用Matlab的NN工具箱进行时间序列预测(I' ve为一个隐藏层使用了一些其他大小,结果相似)。我修改了网络以获取多个输入(最多5个或10个)以及相关的更改为net.inputConnect,并且它可以工作(也就是说,我可以训练它并获得良好的结果)。

一旦我将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是一个空数组,由(内置)Q函数中的值nntraining.setup()确定。 Q由另一个我无法访问的函数(nntraining.config)设置。现在,显然我不相信错误在那些函数中,但我试图通过追溯问题找到错误。而现在我靠墙了。

归结为2个问题

  1. 我想使用divideblock代替dividerand因为我希望图层延迟能够利用信号的时间结构(它是高度周期性的 - 腿部)走路时的关节角度)。我错误地认为dividerand无法利用这种时间结构吗?

  2. train函数与divideblock的交互方式是否存在某些特性,这意味着我需要更改一些有关数据格式的内容?

  3. 非常感谢!

2 个答案:

答案 0 :(得分:3)

问题在于网络divideMode参数。静态网络的默认值为'sample',动态网络'time'的默认值为layrecnet。我还没有找到两者之间区别的明确解释,但是当我初始化'sample'(层复现网络,据说是一个动态网络)时,它会初始化为'time'而不是divideMode。因此,它没有将数据划分为训练,验证和测试集,而是对整个输入进行了培训。在安装过程中手动更改该值可解决问题。

从工具箱文档:

  

此属性定义在调用数据除法函数时要分割的目标数据维。

就时间序列数据而言,这似乎与跨越试验的时间相互关联,可以这么说。也就是说,如果数据是作为一组并发试验输入的("并发"和#34;顺序"是NN输入的一种数据类型),'sample'被设置为{ {1}},它会选择一部分试验用于培训与验证与测试。如果有人看到这个并且可以提供更明确的解释,请做。

答案 1 :(得分:1)

对于动态网络(如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';动态网络的%'时间'或静态网络的'样本'

相关问题