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层添加激活函数,整个网络是纯线性变换,计算步骤如下:
- 计算隐藏层输出:
h = x @ W0 + b0(@表示矩阵乘法) - 计算最终预测值:
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
相关产品推荐
相关产品推荐

