如何使用MATLAB神经网络工具箱进行模型训练

4 阅读5分钟

一、模型训练的核心逻辑

MATLAB神经网络训练的本质是:通过优化算法调整网络中神经元的连接权重,最小化预测值与真实值的误差。核心流程可总结为: 数据预处理 → 创建网络 → 设置训练参数 → 执行训练 → 评估与调优 工具箱封装了所有核心算法(如BP、LSTM、CNN等),无需手动推导梯度下降公式,只需关注参数设置和结果评估。

二、实战1:回归任务训练(BP神经网络预测房价)

以经典的波士顿房价预测为例,完整演示回归模型的训练流程。

步骤1:训练前准备(数据预处理)

% 1. 加载内置数据集
[inputs, targets] = house_dataset; % 13维输入特征,1维房价标签

% 2. 数据预处理(训练的基础,必须保证数据质量)
% 移除常量特征、缺失值
inputs = removeconstantrows(inputs);
inputs = removenanrows(inputs'); inputs = inputs';
targets = removenanrows(targets'); targets = targets';

% 归一化(消除量纲,加速收敛)
[inputsNorm, inputSettings] = mapminmax(inputs, 0, 1);
[targetsNorm, targetSettings] = mapminmax(targets, 0, 1);

% 划分训练集/验证集/测试集(70%:15%:15%)
[inputTrain, inputVal, inputTest, targetTrain, targetVal, targetTest] = dividerand(...
    inputsNorm, targetsNorm, 0.7, 0.15, 0.15);

步骤2:创建神经网络并配置核心训练参数

% 1. 创建前馈BP网络(回归任务首选)
% feedforwardnet(隐藏层神经元数, 训练算法)
% 常用训练算法:trainlm(小样本、高精度)、trainscg(大样本、快速度)
net = feedforwardnet(8, 'trainlm');

% 2. 设置核心训练参数(决定训练效果的关键)
net.trainParam.epochs = 1000;        % 最大训练轮数(迭代次数)
net.trainParam.goal = 1e-5;          % 训练目标误差(达到该值则提前停止)
net.trainParam.lr = 0.01;            % 学习率(控制权重更新步长)
net.trainParam.min_grad = 1e-6;      % 最小梯度值(梯度过小则停止训练)
net.trainParam.max_fail = 10;        % 验证集误差连续上升次数(防止过拟合)
net.trainParam.show = 50;            % 每50轮显示一次训练状态

% 3. 绑定数据处理流程(可选,自动处理数据)
net.inputs{1}.processFcns = {'removeconstantrows', 'mapminmax'};
net.outputs{2}.processFcns = {'removeconstantrows', 'mapminmax'};

步骤3:执行训练并监控过程

% 训练网络,返回训练后的网络和训练记录
[net, tr] = train(net, inputTrain, targetTrain);

% 训练记录tr包含的关键信息(可用于分析训练状态)
fprintf('实际训练轮数:%d\n', tr.epoch(end));
fprintf('最终训练集误差:%.6f\n', tr.perf(end));
fprintf('最终验证集误差:%.6f\n', tr.vperf(end));

训练窗口说明: 运行后会自动弹出训练监控窗口,包含:

  • 网络结构可视化:输入层→隐藏层→输出层的连接关系;
  • 误差曲线:训练集/验证集/测试集的误差变化;
  • 训练状态:当前轮数、误差、学习率等实时信息。

步骤4:训练后评估与结果还原

% 用测试集验证训练效果
yTestNorm = net(inputTest);
% 反归一化还原真实房价尺度
yTest = mapminmax('reverse', yTestNorm, targetSettings);
targetTest = mapminmax('reverse', targetTest, targetSettings);

% 计算核心评估指标
mseError = mse(yTest - targetTest);       % 均方误差(越小越好)
r2Score = corr(yTest, targetTest)^2;      % 决定系数(越接近1越好)
fprintf('测试集均方误差:%.4f\n', mseError);
fprintf('测试集R²系数:%.4f\n', r2Score);

% 可视化训练结果
figure;
plot(targetTest, 'b-o', 'LineWidth', 1); hold on;
plot(yTest, 'r--s', 'LineWidth', 1);
legend('真实房价', '预测房价');
title('训练后模型预测效果');
xlabel('样本序号'); ylabel('房价(万美元)');
grid on;

三、实战2:分类任务训练(patternnet分类鸢尾花)

分类任务的训练逻辑与回归一致,但网络类型和标签处理不同:

% 1. 加载分类数据集并处理标签
[inputs_cls, targets_cls] = iris_dataset; % 4维特征,3类鸢尾花
targets_cls = ind2vec(targets_cls); % 将类别索引转为二进制向量(适配网络输出)

% 2. 划分数据集
[inputTrain_cls, ~, inputTest_cls, targetTrain_cls, ~, targetTest_cls] = dividerand(...
    inputs_cls, targets_cls, 0.7, 0, 0.3);

% 3. 创建分类专用网络
net_cls = patternnet(10); % patternnet专为分类任务优化

% 4. 设置训练参数(与回归一致)
net_cls.trainParam.epochs = 500;
net_cls.trainParam.goal = 1e-4;
net_cls.trainParam.lr = 0.01;

% 5. 执行训练
[net_cls, tr_cls] = train(net_cls, inputTrain_cls, targetTrain_cls);

% 6. 评估分类效果
yTest_cls = net_cls(inputTest_cls);
yTest_cls = vec2ind(yTest_cls); % 将输出向量转回类别索引
targetTest_cls = vec2ind(targetTest_cls);

accuracy = sum(yTest_cls == targetTest_cls) / length(targetTest_cls) * 100;
fprintf('分类准确率:%.2f%%\n', accuracy);

% 混淆矩阵可视化(分类任务核心评估工具)
figure;
confusionmat(targetTest_cls, yTest_cls);
title('鸢尾花分类混淆矩阵');

四、核心训练参数调优指南(新手必看)

训练效果不佳时,优先调整以下参数,按优先级排序:

参数名作用调优建议
epochs最大训练轮数过小欠拟合,过大过拟合;先设500-1000,看收敛情况
lr(学习率)权重更新步长新手默认0.01;收敛慢调大(0.05),震荡调小(0.001)
max_fail验证集误差连续上升次数设5-10,防止过拟合(验证集误差上升则停止训练)
隐藏层神经元数网络拟合能力过少欠拟合,过多过拟合;从5-10开始试,逐步调整
训练算法优化方式小样本(<1000)用trainlm,大样本用trainscg

调优实操示例(以学习率为例)

% 对比不同学习率的训练效果
lrList = [0.001, 0.01, 0.05];
mseList = [];

for i = 1:length(lrList)
    net = feedforwardnet(8, 'trainlm');
    net.trainParam.epochs = 500;
    net.trainParam.lr = lrList(i); % 更换学习率
    [net, tr] = train(net, inputTrain, targetTrain);
    
    % 计算测试集MSE
    yTestNorm = net(inputTest);
    yTest = mapminmax('reverse', yTestNorm, targetSettings);
    mseList(i) = mse(yTest - targetTest);
end

% 可视化调优结果
figure;
plot(lrList, mseList, 'o-', 'LineWidth', 1.5);
xlabel('学习率');
ylabel('测试集均方误差');
title('不同学习率的训练效果对比');
grid on;

五、训练中常见问题及解决方案

1. 训练不收敛(误差始终很高)

  • 原因:学习率过大/过小、隐藏层神经元数不足、数据未归一化;
  • 解决:
    1. 检查数据是否完成归一化(必做);
    2. 调小学习率(如0.001),增加训练轮数;
    3. 适当增加隐藏层神经元数(如从8增至12)。

2. 过拟合(训练集误差小,测试集误差大)

  • 原因:训练轮数过多、神经元数过多、数据量不足;
  • 解决:
    1. 减小max_fail(如设为5),提前停止训练;
    2. 减少隐藏层神经元数;
    3. 增加正则化(net.performParam.regularization = 0.01)。

3. 训练速度过慢

  • 原因:选用trainlm算法处理大样本、训练轮数过多;
  • 解决:
    1. 更换为trainscgtrainrp算法;
    2. 减少隐藏层神经元数;
    3. 增大学习率(如0.05)。