【问题标题】:Neural network train matlab parfor problems神经网络训练matlab parfor问题
【发布时间】:2015-10-28 22:38:18
【问题描述】:

我试图找出哪里出错了。如果你能帮助我,我会很高兴。

这是我的问题:

在序列中,来自神经网络工具箱的火车,函数以一种方式运行,但是当我将它放入 parfor 循环时,一切都变得疯狂。

>> version

ans =

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';  % Divide data randomly
redeT.divideMode = 'sample';  % Divide up every sample
redeT.divideParam.trainRatio = 80/100;
redeT.divideParam.valRatio = 10/100;
redeT.divideParam.testRatio = 10/100;
redeT.trainFcn = 'trainscg';  % Scaled conjugate gradient
redeT.performFcn = 'crossentropy';  % Cross-entropy
redeT.trainParam.showWindow=0; %default is 1)
redeT = train(redeT,tSet,Y);    
outputs = sim(redeT,CrossVal);
per = perform(redeT,Ycv,outputs);

end

这是我正在输入的代码:

Data loaded in workspace
whos
        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 local
Starting 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 次​​p>

per = cell(12,1);
parfor ii = 1 : 12
per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);
end        

per

per = 

    [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 : 12
per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);
end
per

per = 

    [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';  % Divide data randomly
redeT.divideMode = 'sample';  % Divide up every sample
redeT.divideParam.trainRatio = 80/100;
redeT.divideParam.valRatio =  10/100;
redeT.divideParam.testRatio = 10/100;

redeT.trainFcn = 'trainscg';  % Scaled conjugate gradient
redeT.performFcn = 'crossentropy';  % Cross-entropy
redeT.trainParam.showWindow=0; %default is 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);
end
end

结果:

>> 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

【问题讨论】:

  • 据我所知,该功能工作正常。在 parfor 循环中,您只需运行串行版本 12 次并将所有 12 个结果存储在 per 中。您得到不同结果的原因是因为您每次都随机划分数据。是这个问题吗?
  • 嗯,但如果我在函数中运行一个循环,它总是给我 0.9。这个行为正常吗?
  • 你的意思是当你用 for 循环替换 parfor 循环时?另外,我刚刚看到两次运行 parfor 循环每次都会给出相同的结果,所以我认为这不是随机初始化。这真的很奇怪。
  • 我在问题中添加了仅使用 for 循环运行的结果
  • 这真的很奇怪。恐怕我目前没有答案,但我会试着考虑一下。

标签: matlab parallel-processing machine-learning neural-network parfor


【解决方案1】:

哦!我想我找到了它,但无法测试它。

你的代码中有:

redeT.divideFcn = 'dividerand';  % Divide data randomly

如果每个工人随机选择数据,那么他们期望得到不同的结果,不是吗?

尝试下一个:

per = cell(12,1);
parfor ii = 1 : 12
   rng(1); % set the seed for random number generation, so every time the number generated will be the same
   per{ii} = neuralTr(tSet,Y,CrossVal,Ycv);
end
per

不确定neuralTr 是否确实在里面设置了种子,但试一试。

【讨论】:

  • 优秀的答案!我在我的代码中使用它。 Vielen danke 我的朋友!
猜你喜欢
  • 2012-12-04
  • 2010-11-20
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2015-08-13
  • 2011-04-07
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多