Hack_Alex 2025-03-07 21:33 采纳率: 0%
浏览 605

trainnetwork中出现如下报错:错误使用 trainNetwork (第 191 行)训练序列具有特征维度 12,但输入层需要特征维度为 1 的序列,如何解决?

trainnetwork中出现如下报错:错误使用 trainNetwork (第 191 行)
训练序列具有特征维度 12,但输入层需要特征维度为 1 的序列。

出错 learn_1 (第 52 行)
lstm_model = trainNetwork(X_train_lstm, Y_train, layers, options);

请问这如何解决呢?

源代码:

clc;
clear;
close all;

% 1. 生成示例数据
rng(0);
data = randn(216,1);

% 2. 划分训练集和测试集
train_ratio = 0.7;
train_size = round(length(data)*train_ratio);
train_data = data(1:train_size);
test_data = data(train_size+1:end);

% 3. 创建滞后特征(12个滞后值预测下一步)
createFeatures = @(x) [x(1:end-12), x(2:end-11), x(3:end-10), x(4:end-9),...
                      x(5:end-8), x(6:end-7), x(7:end-6), x(8:end-5),...
                      x(9:end-4), x(10:end-3), x(11:end-2), x(12:end-1)];

% 创建特征和目标
X_train = createFeatures(train_data);
Y_train = train_data(13:end);
X_test = createFeatures(test_data);
Y_test = test_data(13:end);

% 4. 训练随机森林模型
numTrees = 100;
rf_model = TreeBagger(numTrees, X_train, Y_train, 'Method', 'regression');

% 5. 训练LSTM模型
% 转换数据格式
X_train_lstm = cell(size(X_train,1),1);
for i = 1:size(X_train,1)
    X_train_lstm{i} = X_train(i,:)';
end

% 定义LSTM网络
inputSize = 1;
numHiddenUnits = 50;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(1)
    regressionLayer];

options = trainingOptions('adam', ...
    'MaxEpochs', 150, ...
    'GradientThreshold', 1, ...
    'InitialLearnRate', 0.01, ...
    'Verbose', 0);

lstm_model = trainNetwork(X_train_lstm, Y_train, layers, options);


  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2025-03-07 21:42
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据报错信息,错误出现在训练序列具有特征维度为12,但输入层需要特征维度为1的情况下。这是因为创建特征时,使用了12个滞后值来预测下一个值,但是LSTM网络的输入层只接受特征维度为1的序列。 解决方法是修改创建特征的函数,只保留一个滞后值作为特征即可。下面是修改后的代码示例:
    % 创建滞后特征(1个滞后值预测下一步)
    createFeatures = @(x) x(1:end-1);
    % 创建特征和目标
    X_train = createFeatures(train_data);
    Y_train = train_data(2:end);
    X_test = createFeatures(test_data);
    Y_test = test_data(2:end);
    % 重新转换数据格式
    X_train_lstm = cell(size(X_train,1), 1);
    for i = 1:size(X_train,1)
        X_train_lstm{i} = X_train(i,:);
    end
    

    修改完创建特征的函数后,重新执行训练网络的代码应该就可以顺利运行了。这样就解决了训练序列特征维度不匹配的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月7日