Neural Network hyperparameter tuning
    11 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Saeed Magsi
 el 27 de En. de 2022
  
    
    
    
    
    Comentada: Shubham Baisthakur
 el 8 de Mzo. de 2023
            Hello. I have been working on hyperparameter tuning using bayesopt but i am getting an error [" The logical indices in position 2 contain a true value outside of the array bounds "]. I have actually two outputs. I have applied the following code but it did not work in my case. As it works on one output only. Can anyone help me on this. Regards.
% Make some data
Daten = rand(100, 3);
Daten(:,3) = Daten(:,1) + Daten(:,2) + .1*randn(100, 1);  % Minimum asymptotic error is .1
[m,n] = size(Daten) ;
% Split into train and test
P = 0.7 ;
Training = Daten(1:round(P*m),:) ; 
Testing = Daten(round(P*m)+1:end,:);
XTrain = Training(:,1:n-1);
YTrain = Training(:,n);
XTest = Testing(:,1:n-1);
YTest = Testing(:,n);
% Define a train/validation split to use inside the objective function
cv = cvpartition(numel(YTrain), 'Holdout', 1/3);
% Define hyperparameters to optimize
vars = [optimizableVariable('hiddenLayerSize', [1,20], 'Type', 'integer');
	    optimizableVariable('lr', [1e-3 1], 'Transform', 'log')];
% Optimize
minfn = @(T)kfoldLoss(XTrain', YTrain', cv, T.hiddenLayerSize, T.lr);
results = bayesopt(minfn, vars,'IsObjectiveDeterministic', false,...
    'AcquisitionFunctionName', 'expected-improvement-plus');
T = bestPoint(results)
% Train final model on full training set using the best hyperparameters
net = feedforwardnet(T.hiddenLayerSize, 'traingd');
net.trainParam.lr = T.lr;
net = train(net, XTrain', YTrain');
% Evaluate on test set and compute final rmse
ypred = net(XTest');
finalrmse = sqrt(mean((ypred - YTest').^2))
function rmse = kfoldLoss(x, y, cv, numHid, lr)
% Train net.
net = feedforwardnet(numHid, 'traingd');
net.trainParam.lr = lr;
net = train(net, x(:,cv.training), y(:,cv.training));
% Evaluate on validation set and compute rmse
ypred = net(x(:, cv.test));
rmse = sqrt(mean((ypred - y(cv.test)).^2));
end
Respuesta aceptada
  KSSV
      
      
 el 29 de En. de 2022
        You have straight away extended the single input method to two inputs method and messed with the dimensions. You need to check the dimensions of the input. This line:
cv=cvpartition(numel(YTrain),"HoldOut",1/3);
As you have used numel, it considers your input is 70*2 = 140 instead of 70. And while using cv for indexing, you are getting that error. Replace that line with:
cv=cvpartition(length(YTrain),"HoldOut",1/3);
The said error will be resolved. You may get errors later as well, check the dimensions properly. 
2 comentarios
  Shubham Baisthakur
 el 8 de Mzo. de 2023
				Is it possible to extend this method to optimize the number of fully-connected layers in ANN architecture?
Más respuestas (0)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



