MATLAB前馈神经网络调用预测与手动前向传播结果不一致疑问
问题解答
核心结论
训练完成的前馈神经网络预测仅需执行从输入层到输出层的前向传播即可,你两次计算结果不一致的原因是遗漏了MATLAB feedforwardnet 默认开启的自动输入标准化、输出反标准化步骤,二者的计算逻辑本质完全相同,修正步骤后结果会完全一致。
具体原因
MATLAB的feedforwardnet类在训练阶段会默认对输入数据集和输出标签调用mapminmax函数做归一化处理,将所有数据映射到[-1, 1]区间,以提升训练收敛速度和效果。在调用训练好的模型做预测时,框架会自动执行两步操作:
- 对输入的原始数据套用训练阶段得到的归一化参数做标准化,再送入网络做前向传播
- 对网络输出的归一化结果,套用训练阶段的输出归一化参数做反归一化,转换为原始量纲的预测值
你手动计算时直接使用原始输入代入权重矩阵计算,没有执行上述两步转换,因此结果和框架直接预测的结果存在偏差。
修正方案
你可以选择以下任意一种方式验证结果一致性:
方案1:关闭自动预处理后重新训练
在定义网络时主动关闭输入输出的自动预处理逻辑,后续训练、预测的逻辑就和你手动计算的逻辑完全对齐:
mynet = feedforwardnet(5); mynet.layers{1}.transferFcn = 'poslin'; mynet.layers{2}.transferFcn = 'purelin'; % 关闭输入、输出的自动预处理 mynet.input.processFcns = {}; mynet.output.processFcns = {}; % 后续正常训练、预测即可
方案2:手动补充标准化/反标准化步骤
如果不想重新训练已有模型,可以手动提取训练阶段的归一化参数,补充到手动前向传播的流程中:
% 提取训练时保存的输入、输出归一化参数 input_norm_params = mynet.inputs{1}.processSettings{1}; output_norm_params = mynet.outputs{2}.processSettings{1}; % 原始输入 raw_input = [3;2]; % 第一步:对原始输入做标准化 norm_input = mapminmax('apply', raw_input, input_norm_params); % 执行前向传播 Z1 = W1 * norm_input + b1; A1 = poslin(Z1); Z2 = W2 * A1 + b2; % 第二步:对网络输出做反标准化得到最终预测值 y_predicted = mapminmax('reverse', Z2, output_norm_params);
执行上述代码得到的y_predicted就会和直接调用mynet(raw_input)的结果完全一致。
内容的提问来源于stack exchange,提问作者Neelabh Jyoti Saharia
相关产品推荐
相关产品推荐

