Expanding Deep Network Architecture for Signal Classification

3 views (last 30 days)
I have implemented a code for classifying P, QRS, T, and NA segments from ECG signals. The current network architecture consists of a sequence input layer, an LSTM layer, and fully connected layers for classification. However, I would like to enhance the performance of the network by incorporating convolutional neural network (CNN) layers to capture more informative features from the ECG signals.
Here is the existing code that I have:
input_data = fsstTrainData(:, 1);
target_data = fsstTrainData(:, 2);
size_input = size(input_data); %cell 315*1
size_input_signals = size(input_data{1, 1}); %double 40*5000
size_target = size(target_data); %cell 315*1
size_target_signals = size(target_data{1, 1}); %categorical 1*5000
layers = [
lstmLayer(200, 'OutputMode', 'sequence')
trainNetwork(input_data, target_data, layers, options);
I would appreciate any assistance in modifying the network architecture to incorporate CNN layers that can extract more informative features from the signals. Your suggestions and guidance would be highly valuable in improving the classification accuracy.
Thank you for your help!

Answers (2)

Aniketh on 9 Jul 2023
Edited: Aniketh on 9 Jul 2023
In order to answer your question how you can incorporate CNN layers to your architecture it is quite straight forward, here is one short example to give you an idea:
cnn_layers = [
imageInputLayer([size_input_signals(1), size_input_signals(2), 1])
convolution2dLayer([3, 3], 16, 'Padding', 'same')
maxPooling2dLayer(2, 'Stride', 2)
convolution2dLayer([3, 3], 32, 'Padding', 'same')
maxPooling2dLayer(2, 'Stride', 2)
lstm_layers = [
lstmLayer(200, 'OutputMode', 'sequence')
layers = [
sequenceFoldingLayer('Name', 'fold')
As for increasing the accuracy/enhancing the performance, you should know these are really empirical methods, just adding more layers or introducing more complex architectures such as this would not necessarily produce better results and might even produce worse results.
Try and experiment on your own, changing the parameters and different architectural changes see what works best for your case, I would suggest reading up on how DL architectures are popularly used for processing ECG Signals, I believe MathWorks has a lot of resources on this as well.
Hope this helped!

Abolfazl Nejatian
Abolfazl Nejatian on 10 Jul 2023
Thank you for taking the time to explain and provide a solution for incorporating CNN layers into the LSTM-based architecture for ECG signal classification. I appreciate your effort and guidance in this matter.
However, I encountered an error while running the code you shared.
here is the error
Error using trainNetwork
Invalid network.
Caused by:
Layer 'fold': Unconnected output. Each layer output must be
connected to the input of another layer.
Layer 9: An input layer must be first in the layer array.
Layer 9: The size of the input data does not match the size
expected by the layer.
It appears that there is an issue with the structure of the network, specifically with the unconnected output in the sequenceFoldingLayer. Additionally, the order of the layers seems to be incorrect, causing a mismatch in the expected input size.
Although the code did not run successfully, I want to express my gratitude for your willingness to help and for sharing your insights. and also i try to update the code by generating random input and target data to see the excactly what i work on
% ------ Generate random input and target data with the original format
% Set the size of the cell arrays
numRows = 315;
signalLen = 5000;
featuresNum = 40;
% Create the inputData cell array
inputData = cell(numRows, 1);
% Create the targetData cell array
targetData = cell(numRows, 1);
% Generate random numbers and assign them to each cell in inputData
for i = 1:numRows
% Generate a random matrix
randomMatrix = rand(featuresNum, signalLen);
% Assign the random matrix to the inputData cell
inputData{i, 1} = randomMatrix;
% Generate a random categorical variable from 'P', 'QRS', 'T', 'NA'
categories = ["P", "QRS", "T", "NA"];
var_P = repmat(categories(1), 1, signalLen);
var_QRS = repmat(categories(2), 1, signalLen);
var_T = repmat(categories(3), 1, signalLen);
var_NA = repmat(categories(4), 1, signalLen);
vars = [var_P,var_QRS,var_T,var_NA];
subsetIdx = randperm(numel(vars),signalLen);
randomCategory = categorical(vars(subsetIdx));
% Create categorical variable and assign it to the targetData cell
targetData{i, 1} = randomCategory;
% LSTM Network Architect
class_num = numel(categories);
layers = [ ...
% Train the Network
options = trainingOptions('adam', ...
'MaxEpochs',10, ...
'MiniBatchSize',40, ...
'InitialLearnRate',0.01, ...
'LearnRateDropPeriod',3, ...
'LearnRateSchedule','piecewise', ...
'GradientThreshold',1, ...
trainNet = trainNetwork(inputData,targetData,layers,options);
Aniketh on 10 Jul 2023
Apologies for the confusion, as I mentioned it was just an example to get you started, the dimensions would not match in the template I gave, having a look at it, the dimensions should be 1/4th the original dimension passed to the CNN, but further in the code you would have to be mindful and check carefully for dimensions.
Abolfazl Nejatian
Abolfazl Nejatian on 11 Jul 2023
Certainly, I acknowledge your statement. I would greatly appreciate it if you could kindly add an additional example that aptly fulfills the given problem data type.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!