我正在使用 Matlab 的 NN 工具箱使用层循环网络 (layrecnet
) 进行时间序列预测,其中 layerDelays = 1:2
和 hiddenSize = 5
(我对一个隐藏层使用了一些其他尺寸,具有类似的结果)。我修改了网络以接受多个输入(最多 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);
通过 Debug模式,我发现valInd
是一个空数组,它是由(内置)nntraining.setup中的一个值
函数。 Q
确定的()Q
由另一个函数 (nntraining.config
) 设置,我无权访问该函数。现在,显然我不相信这些函数中存在错误,但我试图通过追溯问题来找到错误。现在我已经碰壁了。
这可以归结为 2 个问题
我想使用
divideblock
而不是dividerand
因为我希望层延迟能够利用信号的时间结构(它是高度周期性的 - 腿部关节角度)行走时)。我是否错误地认为dividerand
将无法利用这种时间结构?
<train
函数与divideblock
交互的方式是否有一些特殊之处,这意味着我需要更改数据格式?
非常感谢!
最佳答案
问题出在网络的 divideMode
参数上。静态网络的默认值为'sample'
,动态网络的默认值为'time'
。我还没有找到关于两者之间区别的明确解释,但是当我初始化一个layrecnet
(一个层循环网络,据说是一个动态网络)时,它会初始化为'示例'
而不是'时间'
。因此,它没有将数据分为训练集、验证集和测试集,而是对整个输入进行训练。在安装过程中手动更改该值解决了问题。
来自工具箱文档:
This property defines the target data dimensions which to divide up when the data division function is called.
就时间序列数据而言,这似乎与跨时间与跨试验的划分相关,可以这么说。也就是说,如果数据作为一组并发试验输入(“并发”和“顺序”是神经网络输入的数据类型),并且 divideMode
设置为 'sample'
,它将选择一个试验子集进行训练、验证和测试。如果有人看到此内容并且可以提供更清晰的解释,请这样做。
关于Matlab 神经网络 - 与divideFcn 一样的divideblock 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778919/