You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras中model.get_weights()输出解读及网络计算逻辑疑问

问题解答

1. 为什么会有两个权重矩阵?

你代码里定义的模型不是2-1结构,而是2-2-1结构——你连续加了两个Dense层:

  • 第一个Dense(2)是隐藏层:输入是2维特征,输出2个神经元,对应一组2×2的权重矩阵和长度为2的偏置向量
  • 第二个Dense(1)是输出层:输入是隐藏层的2个神经元,输出1个结果,对应一组2×1的权重矩阵和长度为1的偏置向量

如果想要你最初设想的「输入直接到输出」的2-1单层网络,应该把模型改成:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(1)
])

这样就只会有一个2×1的权重矩阵和1个偏置值。

2. 如何用W0、b0、W1、b1复现模型计算?

先明确你输出的参数对应关系:

  • 第一个输出矩阵:W0(隐藏层权重,形状2×2)
  • 第二个输出向量:b0(隐藏层偏置,长度2)
  • 第三个输出矩阵:W1(输出层权重,形状2×1)
  • 第四个输出向量:b1(输出层偏置,长度1)

因为你没有给Dense层添加激活函数,整个网络是纯线性变换,计算步骤如下:

  1. 计算隐藏层输出:h = x @ W0 + b0(@表示矩阵乘法)
  2. 计算最终预测值:y_pred = h @ W1 + b1

实际计算示例

比如取输入x = [0.5, 0.5],用你给出的参数手动计算:

  • 第一步算隐藏层输出h:
    h[0] = 0.5*0.8512728 + 0.5*(-0.04689309) + (-0.23842156) ≈ 0.1638
    h[1] = 0.5*1.555682 + 0.5*1.6778996 + (-0.06958904) ≈ 1.5471
    
  • 第二步算最终预测值:
    y_pred = 0.1638*0.09876956 + 1.5471*0.583725 + 0.08260487 ≈ 1.0019
    

这个结果和模型对[[0.5,0.5]]的输出几乎一致(接近真实值1,误差来自训练精度和浮点数计算)。

代码验证

训练完模型后可以加这段代码验证:

# 提取权重
W0, b0, W1, b1 = model.get_weights()

# 测试输入
x_test = np.array([[0.5, 0.5]])
# 手动计算
h = x_test @ W0 + b0
y_manual = h @ W1 + b1
# 模型预测
y_model = model.predict(x_test, verbose=0)

print(f"手动计算结果: {y_manual[0][0]}")
print(f"模型预测结果: {y_model[0][0]}")

两者输出会高度接近,差异仅来自浮点数精度。

内容的提问来源于stack exchange,提问作者aleph2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:33:21