MATLAB中提取双层隐藏层神经网络数学方程遇结果偏差求解决
问题诊断与解决方案
核心错误点
- 重复应用激活函数:你的手动计算中,
h3 = tansig(b3+W_H2TO*h2)已经是输出层的激活结果(对应网络的最终输出),但你额外执行了Output = tansig(h3),相当于在输出层后多叠加了一层tansig,直接导致结果与net(input)不一致。 - 输入维度匹配问题:MATLAB神经网络要求输入为列向量,若
x是行向量,矩阵乘法会出现维度不匹配或计算逻辑错误。
正确的手动计算步骤
1. 提取网络参数
% 提取各层偏置 b1 = net.b{1}; % 输入层→隐藏层1的偏置(6×1) b2 = net.b{2}; % 隐藏层1→隐藏层2的偏置(4×1) b3 = net.b{3}; % 隐藏层2→输出层的偏置(1×1) % 提取各层权重 W_ITH = net.IW{1,1}; % 输入层→隐藏层1的权重(6×11) W_H1TH2 = net.LW{2,1}; % 隐藏层1→隐藏层2的权重(4×6) W_H2TO = net.LW{3,2}; % 隐藏层2→输出层的权重(1×4)
2. 确保输入为列向量
x = [0.613497 1 1 0.660657 0.675336 0.150442 0.343584 0.162069 0.655799 0.574284 9.83E-05]';
3. 计算网络输出
% 隐藏层1输出 h1 = tansig(W_ITH * x + b1); % 隐藏层2输出 h2 = tansig(W_H1TH2 * h1 + b2); % 输出层结果(无需额外激活) Output = tansig(W_H2TO * h2 + b3);
此时计算出的Output应与net(x)的结果完全一致,可通过isequal(Output, net(x))直接验证。
通用数学方程
针对你的网络结构,输出的数学表达式如下:
给定输入列向量 $\boldsymbol{x} \in \mathbb{R}^{11 \times 1}$:
- 隐藏层1净输入:$\boldsymbol{z_1} = W_{ITH} \boldsymbol{x} + \boldsymbol{b_1}$,其中 $W_{ITH} \in \mathbb{R}^{6 \times 11}$,$\boldsymbol{b_1} \in \mathbb{R}^{6 \times 1}$
- 隐藏层1输出:$\boldsymbol{h_1} = \text{tansig}(\boldsymbol{z_1}) = \frac{2}{1+e^{-2\boldsymbol{z_1}}} - 1$
- 隐藏层2净输入:$\boldsymbol{z_2} = W_{H1TH2} \boldsymbol{h_1} + \boldsymbol{b_2}$,其中 $W_{H1TH2} \in \mathbb{R}^{4 \times 6}$,$\boldsymbol{b_2} \in \mathbb{R}^{4 \times 1}$
- 隐藏层2输出:$\boldsymbol{h_2} = \text{tansig}(\boldsymbol{z_2})$
- 输出层净输入:$z_3 = W_{H2TO} \boldsymbol{h_2} + b_3$,其中 $W_{H2TO} \in \mathbb{R}^{1 \times 4}$,$b_3 \in \mathbb{R}^{1 \times 1}$
- 最终输出:$y = \text{tansig}(z_3)$
内容的提问来源于stack exchange,提问作者Mahmoud
相关产品推荐
相关产品推荐

