我正在尝试找出我犯了什么错误。如果您能帮助我,我将非常感激。
这是我的问题:
在串行模式下,使用神经网络工具箱的训练函数表现正常,但当我将其放入parfor循环中时,一切都变得混乱了。
>> versionans =8.3.0.532 (R2014a)
这是一个函数
function per = neuralTr(tSet,Y,CrossVal,Ycv)hiddenLayerSize = 94;redeT = patternnet(hiddenLayerSize);redeT.input.processFcns = {'removeconstantrows','mapminmax'};redeT.output.processFcns = {'removeconstantrows','mapminmax'};redeT.divideFcn = 'dividerand'; % 随机划分数据redeT.divideMode = 'sample'; % 按样本划分redeT.divideParam.trainRatio = 80/100;redeT.divideParam.valRatio = 10/100;redeT.divideParam.testRatio = 10/100;redeT.trainFcn = 'trainscg'; % 缩放共轭梯度redeT.performFcn = 'crossentropy'; % 交叉熵redeT.trainParam.showWindow=0; %默认值为1)redeT = train(redeT,tSet,Y); outputs = sim(redeT,CrossVal);per = perform(redeT,Ycv,outputs);end
这是我正在输入的代码:
Data loaded in workspacewhos Name Size Bytes Class Attributes CrossVal 282x157 354192 double Y 2x363 5808 double Ycv 2x157 2512 double per 1x1 8 double tSet 282x363 818928 double
在串行模式下执行函数
per = neuralTr(tSet,Y,CrossVal,Ycv) per = 0.90
开始并行处理
>> parpool localStarting parallel pool (parpool) using the 'local' profile ... connected to 12 workers.ans = Pool with properties: Connected: true NumWorkers: 12 Cluster: local AttachedFiles: {} IdleTimeout: Inf (no automatic shut down) SpmdEnabled: true
初始化并并行执行函数12次
per = cell(12,1);parfor ii = 1 : 12per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);end perper = [0.96] [0.83] [0.92] [1.08] [0.85] [0.89] [1.06] [0.83] [0.90] [0.93] [0.95] [0.81]
再次执行以查看随机初始化是否会带来不同的值
per = cell(12,1);parfor ii = 1 : 12per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);endperper = [0.96] [0.83] [0.92] [1.08] [0.85] [0.89] [1.06] [0.83] [0.90] [0.93] [0.95] [0.81]
编辑1:仅使用for循环运行函数
per = cell(12,1);for ii = 1 : 12 per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);end per per = [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90] [0.90]
编辑2:我修改了我的函数,现在一切运作良好。可能问题出在并行时数据的划分上。所以我在发送到并行之前就划分了数据。非常感谢
function per = neuralTr(tSet,Y,CrossVal,Ycv)indt = 1:round(size(tSet,2) * 0.8) ;indv = round(size(tSet,2) * 0.8):round(size(tSet,2) * 0.9);indte = round(size(tSet,2) * 0.9):size(tSet,2);hiddenLayerSize = 94;redeT = patternnet(hiddenLayerSize);redeT.input.processFcns = {'removeconstantrows','mapminmax'};redeT.output.processFcns = {'removeconstantrows','mapminmax'};redeT.divideFcn = 'dividerand'; % 随机划分数据redeT.divideMode = 'sample'; % 按样本划分redeT.divideParam.trainRatio = 80/100;redeT.divideParam.valRatio = 10/100;redeT.divideParam.testRatio = 10/100;redeT.trainFcn = 'trainscg'; % 缩放共轭梯度redeT.performFcn = 'crossentropy'; % 交叉熵redeT.trainParam.showWindow=0; %默认值为1)redeT = train(redeT,tSet,Y); outputs = sim(redeT,CrossVal);per = zeros(12,1);parfor ii = 1 : 12 redes = train(redeT,tSet,Y); per(ii) = perform(redes,Ycv,outputs);endend
结果:
>> per = neuralTr(tSet,Y,CrossVal,Ycv)per = 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90
回答:
哦!我想我找到了,但无法测试它。
你的代码中有:
redeT.divideFcn = 'dividerand'; % 随机划分数据
如果每个工作者都随机选择数据,那么他们有不同的结果是可以预期的,对吗?
试试这个:
per = cell(12,1);parfor ii = 1 : 12 rng(1); % 设置随机数生成的种子,这样每次生成的数字都会相同 per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);endper
不确定neuralTr
是否在内部设置了种子,但可以试试看。