trainnetwork中出现如下报错:错误使用 trainNetwork,训练序列具有特征维度 10 9,但输入层需要特征维度为 9 的序列。
出错 ZTD4 (第 172 行),trainedModel = trainNetwork(XTrain, YTrain, layers, options);如何解决?
源代码:
%% 2. 数据预处理
X = allData(:, 1:9); % 9个输入特征
Y = allData(:, 10); % ZTD输出
fprintf('原始输入特征维度: 样本数×特征数 = %dx%d\n', size(X));
% 数据归一化
[X_norm, xMean, xStd] = normalize(X);
[Y_norm, yMean, yStd] = normalize(Y);
% 划分数据集
rng(42);
n = size(X_norm, 1);
idx = randperm(n);
trainRatio = 0.7;
valRatio = 0.1;
testRatio = 0.2;
trainIdx = idx(1:floor(trainRatio*n));
valIdx = idx(floor(trainRatio*n)+1:floor((trainRatio+valRatio)*n));
testIdx = idx(floor((trainRatio+valRatio)*n)+1:end);
X_train = X_norm(trainIdx, :);
Y_train = Y_norm(trainIdx, :);
X_val = X_norm(valIdx, :);
Y_val = Y_norm(valIdx, :);
X_test = X_norm(testIdx, :);
Y_test = Y_norm(testIdx, :);
% 转换为LSTM输入格式
sequenceLength = 10;
% 准备序列数据
[XTrain, YTrain] = prepareData(X_train, Y_train, sequenceLength);
[XVal, YVal] = prepareData(X_val, Y_val, sequenceLength);
[XTest, YTest] = prepareData(X_test, Y_test, sequenceLength);
% 检查序列数据有效性
if isempty(XTrain) || isempty(YTrain)
error('无法生成有效的序列数据,请减小sequenceLength');
end
% 显示序列数据维度(关键检查)
fprintf('训练序列数据维度: 时间步×特征数×序列数 = %dx%dx%d\n', size(XTrain));
fprintf('模型输入层期望的特征数: %d\n', 9);
%% 3. 构建LSTM模型
inputSize = 9; % 输入特征数
hiddenSize = 50;
outputSize = 1;
layers = [ ...
sequenceInputLayer(inputSize) % 明确接收9维特征
lstmLayer(hiddenSize)
fullyConnectedLayer(outputSize)
regressionLayer];
%% 4. 训练模型前的最终维度验证
if size(XTrain, 2) ~= inputSize
error(['维度不匹配:训练数据特征数为', num2str(size(XTrain, 2)), ...
',模型需要', num2str(inputSize), '个特征']);
end
% 再次确认维度信息
fprintf('训练前最终检查 - 训练数据维度: %dx%dx%d\n', size(XTrain));
fprintf('训练前最终检查 - 特征维度位置的值: %d (应等于9)\n', size(XTrain, 2));
options = trainingOptions('adam', ...
'MaxEpochs', 50, ...
'MiniBatchSize', 64, ...
'Shuffle', 'every-epoch', ...
'Verbose', 1, ...
'Plots', 'training-progress', ...
'ValidationData', {XVal, YVal});
% 训练模型
trainedModel = trainNetwork(XTrain, YTrain, layers, options);