Squeeze-and-Excitation-Inception Architecture for 1D-CNN in MATLAB: Input Data Format Specification and Dimension Matching Issues Between Modules
Show older comments
I have one-dimensional spectral series data in the original format of 2623×377, where 2623 is the number of data points per sample (sequence length), and 377 is the number of samples. I have built a 1D-CNN architecture based on Inception and added a Squeeze-and-Excitation (SE) attention module.
First issue: I am unsure about the specific data dimension order expected by 1D-CNN in MATLAB. I have converted the 2623×377 data into a 2623×1×377 (SCB) format that the network can accept. I am not sure if this is correct.
Second issue: How can I properly match the output of the SE module to the same dimensions as the Inception module for multiplication?
The SE module (the penultimate tempLayers) requires global pooling → fully connected layer → weight calculation → multiplication with the original feature map. However, I encountered a dimension mismatch issue. The SE module outputs [64(C)×1(B)], while the Inception output is [1312(S)×64(C)×1(B)]. The MATLAB multiplication layer requires all inputs to have the same dlarray format. I tried using a functionLayer for reshape operations but failed to achieve the correct dimension transformation. I encountered a format mismatch error: "All inputs of layer 'nnet.cnn.layer.MultiplicationLayer' must be formatted dlarray objects with the same format."
After some attempts, I found that the Inception output [1312(S)×64(C)×1(B)] and the global average pooling output [1(S)×64(C)×1(B)] can be multiplied using the multiplicationLayer. However, after passing through the fully connected layer, the global average pooling output [1(S)×64(C)×1(B)] becomes 64(C)×1(B). How can I reshape the sigmoid layer output back to 1(S)×64(C)×1(B)? Thank you very much for your help.

clc;
Xcal=rand(2623,377);
Xtest=rand(2623,94);
ycal=rand(377,1);
ytest=rand(94,1);
Xcal = dlarray(reshape(Xcal, [2623, 1, 377]), 'SCB');
ycal = dlarray(ycal, 'BC');
Xtest = dlarray(reshape(Xtest, [2623, 1, 94]), 'SCB');
ytest = dlarray(ytest, 'BC');
%%creat network
lgraph = layerGraph();
tempLayers = [
inputLayer([2623,1,NaN], "SCB")
convolution1dLayer(11,32,'Name','conv1_initial','Padding','same')
batchNormalizationLayer('Name','bn1_initial')
reluLayer('Name','relu1_initial')
maxPooling1dLayer(2,'Stride',2,'Name','pool1_initial','Padding','same')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
convolution1dLayer(1,16,'Name','conv_inception_1x1','Padding','same')
batchNormalizationLayer('Name','bn_inception_1x1')
reluLayer('Name','relu_inception_1x1')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
maxPooling1dLayer(3,'Name','pool_inception','Padding','same')
convolution1dLayer(1,16,'Name','conv_inception_pool','Padding','same')
batchNormalizationLayer('Name','bn_inception_pool')
reluLayer('Name','relu_inception_pool')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
convolution1dLayer(1,16,'Name','conv_inception_1x1_1','Padding','same')
batchNormalizationLayer('Name','bn_inception_1x1_1')
reluLayer('Name','relu_inception_1x1_1')
convolution1dLayer(3,16,'Name','conv_inception_3x3','Padding','same')
batchNormalizationLayer('Name','bn_inception_3x3')
reluLayer('Name','relu_inception_3x3')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
convolution1dLayer(1,16,'Name','conv_inception_1x1_2','Padding','same')
batchNormalizationLayer('Name','bn_inception_1x1_2')
reluLayer('Name','relu_inception_1x1_2')
convolution1dLayer(5,16,'Name','conv_inception_5x5','Padding','same')
batchNormalizationLayer('Name','bn_inception_5x5')
reluLayer('Name','relu_inception_5x5')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = depthConcatenationLayer(4,'Name','inception_concat');
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
globalAveragePooling1dLayer('Name','se_global_pool')
fullyConnectedLayer(8,'Name','se_fc_reduce')
reluLayer('Name','se_relu_reduce')
fullyConnectedLayer(64,'Name','se_fc_expand')
sigmoidLayer('Name','se_sigmoid')
functionLayer(@(X) reshape(X, [1, size(X,1), size(X,2)]), 'Name', 'se_reshape')];
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
multiplicationLayer(2,'Name','se_scale')
convolution1dLayer(7,64,'Name','conv2_secondary','Padding','same')
batchNormalizationLayer('Name','bn2_secondary')
reluLayer('Name','relu2_secondary')
maxPooling1dLayer(2,'Stride',2,'Name','pool2_secondary','Padding','same')
fullyConnectedLayer(128,'Name','fc1_final')
reluLayer('Name','relu_fc1')
dropoutLayer(0.5,'Name','dropout_final')
fullyConnectedLayer(64,'Name','fc2_final')
reluLayer('Name','relu_fc2')
fullyConnectedLayer(1,'Name','fc_output')];
lgraph = addLayers(lgraph,tempLayers);
clear tempLayers;
lgraph = connectLayers(lgraph,'pool1_initial','conv_inception_1x1');
lgraph = connectLayers(lgraph,'pool1_initial','pool_inception');
lgraph = connectLayers(lgraph,'pool1_initial','conv_inception_1x1_1');
lgraph = connectLayers(lgraph,'pool1_initial','conv_inception_1x1_2');
lgraph = connectLayers(lgraph,'relu_inception_1x1','inception_concat/in1');
lgraph = connectLayers(lgraph,'relu_inception_pool','inception_concat/in4');
lgraph = connectLayers(lgraph,'relu_inception_3x3','inception_concat/in2');
lgraph = connectLayers(lgraph,'relu_inception_5x5','inception_concat/in3');
lgraph = connectLayers(lgraph,'inception_concat','se_global_pool');
lgraph = connectLayers(lgraph,'inception_concat','se_scale/in1');
lgraph = connectLayers(lgraph,'se_reshape','se_scale/in2');
options = trainingOptions('adam', ...
'MaxEpochs', 300, ...
'InitialLearnRate', 1e-3, ...
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropFactor', 0.5, ...
'LearnRateDropPeriod', 50, ...
'L2Regularization', 1e-5, ...
'ValidationData', {Xtest,ytest}, ...
'ValidationFrequency', 15, ...
'MiniBatchSize', 16, ...
'Verbose', true, ...
'Plots', 'training-progress', ...
'Shuffle', 'every-epoch', ...
'ExecutionEnvironment', 'cpu');
dlnet = dlnetwork(lgraph);
net = trainnet(Xcal,ycal, dlnet, 'mse', options);
Yp=predict(net,Xtest);
Yt=predict(net,Xcal);
Yp=extractdata(Yp);
Yt=extractdata(Yt);
ytest=extractdata(ytest);
ycal=extractdata(ycal);
R2p = 1-sum((Yp-ytest).^2)/sum((ytest- mean(ytest)).^2);
R2t =1-sum((Yt -ycal).^2)/sum((ycal- mean(ycal)).^2);
Accepted Answer
More Answers (0)
Categories
Find more on Built-In Layers in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!