USING LSTM TO CLASSIFY DATA

3 views (last 30 days)
Ernest Modise - Kgamane
Ernest Modise - Kgamane on 7 Jun 2024
Moved: Matt J on 10 Jun 2024
Please see my code below
% Step 1: Load the data from the Excel file
data = readmatrix('LSTMdataIn.xlsx');
% Step 2: Create labels
labels = [ones(200, 1); 2*ones(200, 1); 3*ones(200, 1); 4*ones(200, 1); 5*ones(200, 1)];
% Step 3: Reshape the data
numTimeSteps = 100;
numFeatures = 1;
reshapedData = reshape(data', numFeatures, numTimeSteps, []);
% Step 4: Split the data into training and testing sets
cv = cvpartition(labels, 'HoldOut', 0.2);
trainIdx = training(cv);
testIdx = test(cv);
XTrain = reshapedData(:, :, trainIdx);
YTrain = labels(trainIdx);
XTest = reshapedData(:, :, testIdx);
YTest = labels(testIdx);
% Step 5: Create and train the LSTM network
numHiddenUnits = 100;
layers = [ ...
sequenceInputLayer(100)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(5)
softmaxLayer
classificationLayer];
options = trainingOptions('adam', 'MaxEpochs', 10, 'MiniBatchSize', 32);
net = trainNetwork(XTrain, categorical(YTrain), layers, options);
% Step 6: Evaluate the trained network
YTestPred = classify(net, XTest);
accuracy = sum(YTestPred == categorical(YTest)) / numel(YTest);
I get the following error
Error using trainNetwork (line 191)
The training sequences are of feature dimension 1 100 but the input layer expects sequences of feature dimension 100.

Accepted Answer

Ayush Aniket
Ayush Aniket on 10 Jun 2024
Hi ernest,
Based on your data, I am assuming that you want to perform a 'sequence-to-label' classification task i.e. given a sequence the network should return the label.
There are several errors in your code that need modification:
  • The error you observe is due to the fact that the sequenceInputLayer expects as argument the number of features in the sequence dataset which is '1' for your data and not '100'. Refer to the following link: https://www.mathworks.com/help/deeplearning/ref/nnet.cnn.layer.sequenceinputlayer.html#mw_9b13d129-0114-47c8-9ea3-e2977dd4fed1
  • The trainNetwork function expects training data in the format of 'Nx1' cell array, where 'N' represents the number of observations and each cell should have the data in the format of 'c-by-s' matrix, where 'c' is the number of features of the sequence and 's' is the sequence length. For your data, that would be '1x100'. Here's how you can restructure your data:
% Assuming reshapedData is of size [1, numTimeSteps, numSamples]
% Convert reshapedData into a cell array where each cell contains a single sequence
XTrainCell = num2cell(reshapedData(:, :, trainIdx), [1,2]);
XTestCell = num2cell(reshapedData(:, :, testIdx), [1,2]);
% Each cell now contains a 1xnumTimeSteps matrix, which is a single sequence for the LSTM
% Adjust the training and testing data preparation
XTrain = squeeze(XTrainCell);
XTest = squeeze(XTestCell
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits,OutputMode="last")
fullyConnectedLayer(5)
softmaxLayer
classificationLayer];
Note: Starting in MATLAB R2024a, the classificationLayer and the trainNetwork functions are not recommended to be used. Instead you can use trainnet function to train your LSTM network:

More Answers (0)

Tags

Products


Release

R2024a

Community Treasure Hunt

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

Start Hunting!