I want to parallelize the following for loop but the I have the following problem: In a parfor loop variable 'perf' is indexed in different ways
The problem is in the 3rd line from the bottom because I index in a different way the matrix perf.
How can I avoid this problem?
NET = cell(5,11);
TR = cell(5,11);
ave_perfs = zeros(1,11);
perf = zeros(5,11);
profile on;
parfor j = 1:11
for bin = 1:5
processed_train_Ext = load([ExtensionTrainPath,'/',Features{j},'/','train',num2str(bin),'_processed_Ext'];
processed_train_Flx = load([FlexionTrainPath,'/',Features{j},'/','train',num2str(bin),'_processed_Flx']);
processed_test_Ext = load([ExtensionTestPath,'/',Features{j},'/','test',num2str(bin),'_processed_Ext']);
processed_test_Flx = load([FlexionTestPath,'/',Features{j},'/','test',num2str(bin),'_processed_Flx']);
% concatenating the training data
train_data = [processed_train_Ext.finalMatrix(:,1:end-1); processed_train_Flx.finalMatrix(:,1:end-1)];
true_train_labels = [processed_train_Ext.finalMatrix(:,end); processed_train_Flx.finalMatrix(:,end)];
%concatenating the test data
test_data = [processed_test_Ext.finalMatrix(:,1:end-1) ; processed_test_Flx.finalMatrix(:,1:end-1)];
true_test_labels = [processed_test_Ext.finalMatrix(:,end); processed_test_Flx.finalMatrix(:,end)];
%fit network
net = fitnet(5);
net.divideParam.trainRatio = 0.85;
net.divideParam.valRatio = 0.15;
net.divideParam.testRatio = 0.0;
% train and validate train data
[net, tr] = train(net,train_data',true_train_labels','useParallel','yes');
NET{bin,j} = net;
TR{bin,j} = tr;
% test newly trained network with test data
outputs = NET{bin,j}(test_data','useParallel','yes');
% calculate accuracy on the test data
perf(bin,j) = 1 - mse(net, true_test_labels, outputs);
toc
beep on; beep;
end
% calculate averages of the errors
ave_perfs(1,j) = sum(perf(:,j))/5;
end

댓글 수: 5

Greg
Greg 2017년 9월 28일
편집: Greg 2017년 9월 28일
Not sure it will help the parfor (but it might actually), but 2 things:
% calculate averages of the errors
ave_perfs(1,j) = sum(perf(:,j))/5;
1) Why calculate a mean manually? Use the mean function.
2) Why do it inside the loop?
Try putting this outside the parfor:
% calculate averages of the errors
ave_perfs = mean(perf,1);
Then you wouldn't even need to pre-allocate ave_perfs at the top.
OCDER
OCDER 2017년 9월 28일
Greg, your comment should be in the answer section.
Ioannis, the issue is caused because you are accessing perf via perf(bin,j) AND perf(:,j) within the parfor loop. Matlab can't determine how to slice perf by column or by element, giving that error. By moving the ave_perf = mean(perf,1) outside the parfor, it's now clear perf can be sliced by element and thus no more error occurs.
Greg
Greg 2017년 9월 28일
편집: Greg 2017년 9월 28일
As I stated in the first line, I wasn't sure it was actually an answer. I was hoping Ioannis would respond if it did indeed solve the problem, at which point I can move it to answer.
Thank you for clarifying that it was the source of the problem.
OCDER
OCDER 2017년 9월 29일
I actually didn't know what the issue was until I tried your solution, which did the trick for me.
Greg
Greg 2017년 9월 29일
Ahh, fair enough. My MATLAB machine is not my internet machine, so I'm rarely able to test the poster's code or my own suggestions.
I'm glad we got it solved and an accepted answer. Thanks for the assist.

댓글을 달려면 로그인하십시오.

 채택된 답변

Greg
Greg 2017년 9월 28일

2 개 추천

Try replacing this code (inside the loop):
% calculate averages of the errors
ave_perfs(1,j) = sum(perf(:,j))/5;
With this code (outside the parfor):
% calculate averages of the errors
ave_perfs = mean(perf,1);
Then you could even remove the pre-allocation of ave_perfs at the top.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

질문:

2017년 9월 28일

댓글:

2017년 9월 29일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by