2201_75414568 2025-04-30 18:56 采纳率: 0%
浏览 56

用LSTM神经网络进行训练时出现: 错误使用 trainNetwork (第 191 行) 输入元胞数组的所有内容都必须为相同数据类型

用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'});


  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-30 18:57
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    错误解决方案

    LSTM神经网络训练时出现的错误是因为输入元胞数组的所有内容都必须为相同数据类型。这个错误是由于LSTM网络的输入数据类型不一致导致的。

    在Matlab中,LSTM网络的输入数据类型可以是double、single、int8、int16、int32、int64、uint8、uint16、uint32、uint64等。这些类型都可以是浮点数或整数。

    解决这个错误的方法是确保LSTM网络的输入数据类型是一致的。可以使用class函数来检查输入数据的类型,然后将其转换为相同的类型。

    例如,如果你的输入数据是double类型,可以使用以下代码来转换:

    X = double(X);
    

    如果你的输入数据是int32类型,可以使用以下代码来转换:

    X = int32(X);
    

    将上述代码添加到你的LSTM网络训练代码中,然后重新运行训练过程。

    如果你仍然遇到错误,可以检查你的输入数据是否包含NaN或Inf值,这些值可能会导致LSTM网络训练失败。可以使用以下代码来检查输入数据:

    X(isnan(X)) = 0;
    X(isinf(X)) = 0;
    

    将上述代码添加到你的LSTM网络训练代码中,然后重新运行训练过程。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月30日