用LSTM神经网络进行训练时出现:
错误使用 trainNetwork (第 191 行)
输入元胞数组的所有内容都必须为相同数据类型。
出错 LSTM (第 88 行)
net = trainNetwork(XTrain,YTrain,layers,options);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
原因:
错误使用 cell2mat (第 45 行)
输入元胞数组的所有内容都必须为相同数据类型。
不知道为什么,请问怎么解决
源代码:
%% LSTM 健康状态估计模型
warning off; close all; clear; clc
cd(fileparts(mfilename('fullpath')));
%% 参数设置
sequence_length = 50; % 每段序列长度
data_folder = '.'; % 当前目录
file_list = dir(fullfile(data_folder, 'CS2_35_*.xlsx'));
raw_inputs = [];
raw_outputs = [];
health_factors = [];
fprintf('共检测到 %d 个数据文件\n', length(file_list));
for k = 1:length(file_list)
try
data = xlsread(fullfile(data_folder, file_list(k).name));
data = fillmissing(data, 'previous'); % 插值填补
data = smoothdata(data, 'movmean', 5); % 移动平均滤波
V = data(:,1); % 假设第1列为电压
% 提取健康因子
Vmax = max(V);
Vmin = min(V);
Vmean = mean(V);
Vstart = V(1);
Vend = V(end);
dV = Vend - Vstart;
health_factors = [health_factors; Vmax - Vmin, Vstart, Vmean, dV];
raw_outputs = [raw_outputs; Vend]; % 用末端电压近似SOH
% 构建 LSTM 序列数据
[x, y] = data_process(V, sequence_length);
if size(data, 1) <= sequence_length
fprintf('跳过 %s(数据长度不足)\n', file_list(k).name);
continue;
end
raw_inputs = [raw_inputs; x];
catch ME
fprintf('处理文件 %s 时出错:%s\n', file_list(k).name, ME.message);
end
end
% 数据归一化
method = @mapminmax;
[xs, mapx] = method(raw_inputs'); x = xs';
[ys, mapy] = method(raw_outputs'); y = ys';
% 划分训练/测试集
n = min(size(x,1), size(y,1));
m = round(n*0.7);
XTrain = x(1:m,:)';
XTest = x(m+1:end,:)';
YTrain = y(1:m,:)';
YTest = y(m+1:end,:)';
%% 构建LSTM模型
rng(0)
if isempty(XTrain)
error('错误:训练输入数据为空,请检查数据文件是否有效。');
end
numFeatures = size(XTrain,1);
numResponses = size(YTrain,1);
numHiddenUnits = 100;
maxEpochs = 100;
miniBatchSize = 10;
layers = [
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',maxEpochs, ...
'MiniBatchSize',miniBatchSize, ...
'InitialLearnRate',0.005, ...
'GradientThreshold',1, ...
'Shuffle','every-epoch', ...
'Plots','training-progress', ...
'Verbose',false);
%% 模型训练
net = trainNetwork(XTrain,YTrain,layers,options);
%% 模型预测与评估
YPred = predict(net, XTest);
YPred_real = mapy.reverse(YPred);
YTest_real = mapy.reverse(YTest);
%% 计算预测准确率
mae = mean(abs(YPred_real - YTest_real));
mape = mean(abs((YPred_real - YTest_real)./YTest_real));
accuracy = (1 - mape) * 100;
fprintf('预测准确率:%.2f%%,平均误差:%.4f\n', accuracy, mae);
%% 可视化
figure;
plot(YTest_real, 'k-o'); hold on;
plot(YPred_real, 'r--*');
legend('真实SOH','预测SOH');
title('LSTM预测结果');
xlabel('样本编号'); ylabel('SOH');
%% 健康因子相关性分析
figure;
R = corrcoef([health_factors, raw_outputs]);
imagesc(R);
colorbar;
title('健康因子与SOH的相关系数矩阵');
xticklabels({'ΔV','V0','V̄','dV','SOH'});
yticklabels({'ΔV','V0','V̄','dV','SOH'});