The output size of the last layer does not match the response size?
Mostra commenti meno recenti
I'm training a regression layered CNN by taking advantage of the built in Matlab functions 'digitTrain4DArrayData' and 'digitTest4DArrayData', where I have replaced the original folders in the related directory with my own training/validation images and excel files of numerical data. When running I first got the error:
Error using trainNetwork (line 184)
Invalid input data for fully connected layer. The number of channels in
the input data (1) must match the layer's expected input size (32).
I tried to resolve this by changing my fully-connected layer output size to 32, and instead got the following:
Invalid training data. The output size (32) of the last layer does not
match the number of responses (1).
I believe this is to do with convolution filter, padding and pooling layer sizing, and have tried to rectify this using the equation to determine output size:
O = [(W-K+2P)/S)+1
Where O=Output size, W=Input size,K=Kernel/Pool size,P=Padding size and S=Stride length.
I have tried using this equation to match the output size to the number of responses but can't seem to get it right. Could I get some help with this? Secondly, because my initial input image dimensions are unequal (153 X 365 X 3), do I need to utilise padding to make the length and width the same?
My code is below,
Thank you
[XTrain,~,YTrain] = digitTrain4DArrayData;
[XValidation,~,YValidation] = digitTest4DArrayData;
%Loading in training and validation images
layers = [
imageInputLayer([153 365 3])
convolution2dLayer(3,8,'Padding','same') %8 filters of size 3x3 with 'same' padding (also 3x3), no size
batchNormalizationLayer %Normalising each input between [0,1]
reluLayer %Rectified Linear Unit (ReLu), threshold operation to each element of input, where any value less than zero is set to zero
averagePooling2dLayer(2,'Stride',1) %Pool size 2x2 with Stride/step of 1
convolution2dLayer(3,16,'Padding','same')
batchNormalizationLayer
reluLayer
averagePooling2dLayer(2,'Stride',1)
convolution2dLayer(3,32,'Padding','same')
batchNormalizationLayer
reluLayer
convolution2dLayer(3,32 ,'Padding','same')
batchNormalizationLayer
reluLayer
dropoutLayer(0.2)
fullyConnectedLayer(32) %Regression problem, FC layer must precede the regression layer at the end. Here at size 1
regressionLayer];
%Creating layer networks: 4 pairs of convoluting and pooling operations.
miniBatchSize = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions('sgdm', ...
'MiniBatchSize',miniBatchSize, ...
'MaxEpochs',30, ... %Trained for 30 epochs
'InitialLearnRate',1e-3, ... %Setting inital learn rate to 0.001
'LearnRateSchedule','piecewise', ...
'LearnRateDropFactor',0.1, ...
'LearnRateDropPeriod',20, ... %Lowering the learn rate by 0.1 after 20 epochs
'Shuffle','every-epoch', ...
'ValidationData',{XValidation,YValidation}, ...
'ValidationFrequency',validationFrequency, ...
'Plots','training-progress', ...
'Verbose',false);
%Training the network
net = trainNetwork(XTrain,YTrain,layers,options);
%Creating the network; this command uses a compatible GPU if possible.
YPredicted = predict(net,XValidation);
%Test the performance of the network by evaluating the accuracy on the validation data
predictionError = YValidation - YPredicted;
%Evaluating performance of the model by calculating:
%1. Ther percentage of predictions within an acceptatble error margin
%2. The RMSE of the predicted and actual
thr = 10; %setting threshold to 10
numCorrect = sum(abs(predictionError) < thr);
numValidationImages = numel(YValidation);
%calculating no. predictions within acceptable error margin
accuracy = numCorrect/numValidationImages; %accuracy as a %
squares = predictionError.^2;
rmse = sqrt(mean(squares));
%Calculating RSME
1 Commento
Saurabh Sharma
il 13 Ott 2022
I am trying to do image to image regression neural network training. I have used combine function to combine input images and response images and allocated the combined data in a folder ds. After allocation, I have used trainNetwork function using ds folder: Syntax: trainNetwork(ds, lgraph, options) It shows error: output size does not match with response size.
Risposta accettata
Più risposte (0)
Categorie
Scopri di più su Deep Learning Toolbox in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!