Error using trainNetwork: Predictors must be a N-by-1 cell array of sequences
1 次查看(过去 30 天)
显示 更早的评论
Hello MATLAB friends,
I’m working on a project involving time series prediction using a Gated Recurrent Unit (GRU) model. The goal is to predict whether a stock will be a ‘winning’ or ‘losing’ stock based on historical data.
However, I’m encountering an error when trying to train the network using the trainNetwork function. The error message is:
Error using trainNetwork
Invalid training data. Predictors must be a N-by-1 cell array of sequences, where N is the number of sequences. All sequences must have the same feature dimension and at least one time step.
Here’s the relevant portion of my code:
% Initialize cell arrays to store training and testing features and labels
training_features = {};
training_labels = {};
testing_features = {};
testing_labels = {};
% Process each CSV file in the combined_stocks table
for f = 1:height(combined_stocks)
% Load data from CSV file using readtable
data = readtable(fullfile(directory_path, combined_stocks.Stock(f)), 'VariableNamingRule', 'preserve');
% Selecting the required features
features = data{:, {'open', 'high', 'low', 'close', 'MA', 'MA_1'}};
% Normalizing the close prices
normalized_close = (data.close - min(data.close)) / (max(data.close) - min(data.close));
% Calculating logarithmic close prices
log_close = log(data.close);
% Combine all features into a matrix
features = [features, normalized_close, log_close];
% Determine the label for the current stock
if combined_stocks.Maximum_Profit(f) > 0
labels = ones(height(data), 1); % Winning class
else
labels = zeros(height(data), 1); % Losing class
end
% Convert labels to categorical
labels = categorical(labels);
% Generate a random permutation of indices
indices = randperm(size(features, 1));
% Split the data into 70% training and 30% testing
split_point = round(size(features, 1) * 0.7);
training_indices = indices(1:split_point);
testing_indices = indices(split_point+1:end);
% Append the training and testing features and labels to the respective arrays
training_features = [training_features; {features(training_indices, :)}];
training_labels = [training_labels; {labels(training_indices)}];
testing_features = [testing_features; {features(testing_indices, :)}];
testing_labels = [testing_labels; {labels(testing_indices)}];
end
% Define the GRU network architecture
layers = [ ...
sequenceInputLayer(size(training_features{1}, 2))
gruLayer(100,'OutputMode','last')
fullyConnectedLayer(2)
softmaxLayer
classificationLayer];
% Define the training options
options = trainingOptions('adam', ...
'MaxEpochs',100, ...
'MiniBatchSize', 150, ...
'InitialLearnRate', 0.01, ...
'GradientThreshold', 1, ...
'ExecutionEnvironment','auto',...
'plots','training-progress', ...
'Verbose',false);
% Train the GRU network
net = trainNetwork(training_features, training_labels, layers, options);
In my code, training_features and training_labels are N-by-1 cell arrays. Each cell in training_features contains a matrix of size M-by-8, where M is the number of time steps and 8 is the number of features. Each cell in training_labels contains a categorical vector of length M, where M is the same as in the corresponding cell of training_features.
Despite this, I’m still getting the error. Any help would be greatly appreciated!
0 个评论
回答(1 个)
Krishna
2024-6-6
Hi David,
I understand you're aiming to classify the sequence into a categorical variable of either 0 or 1. For a sequence with input dimensions Mx8, your predicted output should have a dimension of 1, not Mx1. This is because you are using the output mode 'last' in GRU layer. If you want it to output a sequence make it to 'sequence.' This adjustment should address your issue.
Please go through the following documentation to learn more,
Hope this helps.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Classification Learner App 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!