我使用带有layrecnet
和layerDelays = 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个问题
我想使用divideblock
代替dividerand
因为我希望图层延迟能够利用信号的时间结构(它是高度周期性的 - 腿部)走路时的关节角度)。我错误地认为dividerand
无法利用这种时间结构吗?
train
函数与divideblock
的交互方式是否存在某些特性,这意味着我需要更改一些有关数据格式的内容?
非常感谢!
答案 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';动态网络的%'时间'或静态网络的'样本'