如何用MATLAB中LSTM网络实现QoS预测及报错解决
问题解决:trainNetwork参数过多报错及QoS预测代码修正
核心报错原因
trainNetwork要求输入的训练数据格式匹配序列模型要求,你当前传入的x_train和y_train是table类型,未转换为序列模型所需的三维数组(时间步×特征数×样本数)或cell数组,导致Matlab解析参数时出错。另外代码中还有两个未定义的超参数需要补全。
具体修正步骤
1. 补全未定义的超参数
在trainingOptions代码块前,添加超参数的具体定义:
maxEpochs = 50; miniBatchSize = 32;
2. 转换训练数据为序列兼容格式
将table类型的输入输出数据转换为三维数组(适配序列模型的输入要求):
% 将table转为数值矩阵 x_matrix = table2array(x); y_matrix = table2array(y); % 重构为序列格式:时间步×特征数×样本数 x_seq = permute(reshape(x_matrix', 10, 1, []), [2,1,3]); y_seq = permute(reshape(y_matrix', 10, 1, []), [2,1,3]); % 重新划分训练测试集 height_x = size(x_seq,3); split = fix(height_x*0.8); x_train = x_seq(:,:,1:split); x_test = x_seq(:,:,split+1:end); y_train = y_seq(:,:,1:split); y_test = y_seq(:,:,split+1:end);
若后续需要使用更长时间步(比如
delta_x>1),只需调整reshape的维度,保持时间步×特征数×样本数的格式即可。
3. 完整修正后的代码
data = readtable('C:\Users\Etudiant FST\Documents\études\mini_pjt\d\qws1\qws1.txt'); %test_data = readtable('C:\Users\Etudiant FST\Documents\études\mini_pjt\d\qws2\qws2.txt'); data = data(:,1:10); x = []; y = []; delta_x = 1; delta_y = 1; pas = 1; while (height(data) >= delta_x + delta_y) x = [x; data(1:delta_x,:)]; y = [y; data(delta_x + 1:delta_x + delta_y,:)]; data(1:pas,:) = []; end % 转换table为序列格式数据 x_matrix = table2array(x); y_matrix = table2array(y); x_seq = permute(reshape(x_matrix', 10, 1, []), [2,1,3]); y_seq = permute(reshape(y_matrix', 10, 1, []), [2,1,3]); % 划分训练测试集 height_x = size(x_seq,3); split = fix(height_x*0.8); x_train = x_seq(:,:,1:split); x_test = x_seq(:,:,split+1:end); y_train = y_seq(:,:,1:split); y_test = y_seq(:,:,split+1:end); % 定义超参数 maxEpochs = 50; miniBatchSize = 32; layers = [ sequenceInputLayer(10) lstmLayer(128,'OutputMode','sequence') fullyConnectedLayer(10) regressionLayer]; options = trainingOptions('adam', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'InitialLearnRate',0.01, ... 'GradientThreshold',1, ... 'Shuffle','never', ... 'Plots','training-progress',... 'Verbose',0); net = trainNetwork(x_train,y_train,layers,options);
额外优化建议
- 若要提升预测效果,可尝试增大
delta_x(比如用过去3个时间步的QoS数据预测下一个时间步),同时保持sequenceInputLayer输入维度为10,根据需求调整LSTM层的OutputMode为sequence或last。 - 可在LSTM层后添加
dropoutLayer(0.2),防止模型过拟合。
内容的提问来源于stack exchange,提问作者Imene Bengamra
相关产品推荐
相关产品推荐

