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, [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
Prashant Kumar answered .
2025-11-20
inputSize = [153 365 3];
numSamples = 128;
numClasses = 4;
responseSize = 32;
%% Generate random data for training the network.
trainData = randn([inputSize numSamples]);
trainLabels = randn([numSamples responseSize]);
%% Create a network.
layers = [
imageInputLayer(inputSize)
convolution2dLayer(3,8,'Padding','same')
reluLayer
averagePooling2dLayer(2,'Stride',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(responseSize)
regressionLayer];
analyzeNetwork(layers);
%% Define training options.
options = trainingOptions('adam', ...
'InitialLearnRate',0.005, ...
'LearnRateSchedule','piecewise',...
'MaxEpochs',1, ...
'MiniBatchSize',4, ...
'Verbose',1, ...
'Plots','training-progress',....
'ExecutionEnvironment','cpu');
%% Train the network.
net = trainNetwork(trainData,trainLabels,layers,options);