simulink调用神经网络训练好的模型进行回归预测,分类,以及时间序列分析。 事先根据数据集对模型进行训练,以此保存最好模型,再在simulink中调用保存的模型,实现预测需求。 包括MATLAB程序,以及simulink模型。

直接说重点——Simulink调用训练好的神经网络模型其实比想象中简单得多。咱们先搞定模型训练和保存环节,再聊怎么在Simulink里玩转预测。先看个回归预测的例子:

假设手头有个发动机性能数据集,用MATLAB训练个前馈网络:

% 生成示例数据
X = linspace(0,10,1000)';
Y = 0.5*X.^2 + 3*sin(X) + 0.1*randn(1000,1);

% 构建网络结构
net = feedforwardnet([20 15]);  
net.trainParam.epochs = 150;
net.divideParam.trainRatio = 0.7;

% 训练与保存
[net,tr] = train(net, X', Y');
save('best_net.mat', 'net')  % 关键保存操作

这里有个细节要注意:输入输出数据需要转置,Simulink调用时维度必须和训练时一致。训练完成后别急着关工作区,先plot一下预测效果,确保模型靠谱。

simulink调用神经网络训练好的模型进行回归预测,分类,以及时间序列分析。 事先根据数据集对模型进行训练,以此保存最好模型,再在simulink中调用保存的模型,实现预测需求。 包括MATLAB程序,以及simulink模型。

接下来在Simulink里拖入MATLAB Function模块,写个预测包装函数:

function y = neural_predict(u)
%#codegen
persistent net;
if isempty(net)
    net = coder.loadDeepLearningNetwork('best_net.mat');
end
y = predict(net, u');
y = y';  % 输出转置回来

这个persistent声明让模型只加载一次,避免重复初始化拖慢速度。注意输入输出转置要和训练时相反,这是个高频踩坑点。

分类任务稍微调整下结构就行。假设要识别设备故障类型:

% 加载分类数据
load('bearing_fault_data.mat') 

% 构建分类网络
net = patternnet([18 12]);
net.performFcn = 'crossentropy';
[net,tr] = train(net, features', categorical_labels');

% 导出为ONNX格式
exportONNXNetwork(net, 'classification.onnx')

Simulink这次改用Import ONNX Model模块,直接把模型拖到画布上。输入接个Bus Creator处理多传感器信号,输出接Interpreted MATLAB Function做类型解码:

function fault_type = decode_output(y)
[~, idx] = max(y);
types = {'Normal', 'InnerRace', 'OuterRace', 'BallFault'};
fault_type = types{idx};

时间序列预测最带劲。用LSTM预测股价走势:

numFeatures = 5;  % 开盘价、收盘价等特征
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(128)
    fullyConnectedLayer(1)
    regressionLayer];

options = trainingOptions('adam', ...
    'MaxEpochs', 200, ...
    'SequenceLength', 30);  % 30天滑动窗口

trainNetwork(stockData, layers, options);
save('lstm_net.mat', 'net')

Simulink这里需要处理时序数据流,推荐用MATLAB System模块实现滑动窗口:

classdef TimeSeriesPredictor < matlab.System
    properties
        window_size = 30;
    end
    properties(Access=private)
        buffer;
        net;
    end
    
    methods
        function setupImpl(obj)
            obj.buffer = [];
            obj.net = coder.loadDeepLearningNetwork('lstm_net.mat');
        end
        
        function y = stepImpl(obj, u)
            obj.buffer = [obj.buffer; u];
            if length(obj.buffer) > obj.window_size
                obj.buffer(1,:) = [];
            end
            y = predict(obj.net, obj.buffer');
        end
    end
end

这个缓存机制实现了实时数据流的窗口截取,注意每次预测都要转置输入数据。遇到延迟问题可以试试修改窗长或者LSTM的hidden state维护方式。

几个避坑指南:

  1. 输入数据必须和训练时同尺度,最好在Simulink里加个归一化模块
  2. 遇到维度错误时优先检查转置方向
  3. 时序预测注意模型内部状态重置问题
  4. 多分类任务输出层用softmax激活,二分类用sigmoid

模型部署后别光看曲线,建议接个Assertion模块验证输出范围。遇到模型不收敛的情况,先回MATLAB检查训练数据是否带进Simulink时发生了意外类型转换。最后记得用Simulink Coder生成代码时,勾选深度学习库支持选项。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐