我正在学习Keras中的神经网络公式。假设我有一个单层神经网络和特定的权重。(我知道我们在实践中随机地给出了权重。)见下图。

根据我学到的公式,损失是(7-8)^2+(16-9)^2/2=25。然而,真正的结果是15. 1/1 [==============================] - 0s 202ms/step - loss: 15.0000参见下面的代码。
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import initializers
import numpy as np
model = models.Sequential()
model.add(layers.Dense(units=2,
activation=None,
kernel_initializer=initializers.constant(np.array([3,5])),
bias_initializer=initializers.constant(np.array([4,6])),
)
)
model.compile(optimizer='sgd',
loss='mse',
)
x = np.array([
[1],
[2]
])
y = np.array([
[8],
[9]
])
model.fit(x, y, epochs=1)
model.layers[0].weights我误解了什么?
发布于 2021-07-21 13:16:16
这在某种程度上很难解释,因为您的体系结构是不正确的。
让我们一步一步地走:
,
>>> model.predict([1])
array([[ 7., 11.]], dtype=float32) #for input 1, model gives 2 output: 7 and 11
>>> model.predict([2])
array([[ 10., 16.]], dtype=float32) #for input 2, model gives 2 output: 10 and 16现在,让我们探讨一下上面的输出是如何计算出来的。您已经设置了2个权重3,5和2个偏差: 4,6。

y_true,但是您提供了2个值[8,9]作为基本真值。无论如何,您提供两个输入:[1,2]到您的模型。模型输出4个值:[[7,11][10,16]],model.evaluate输出15.0作为损失:>>> x, y = np.array([[1],[2]]), np.array([[8],[9]])
>>> model.evaluate(x,y, verbose=2)
1/1 - 0s - loss: 15.0000让我们看看它是如何计算的。在前面的计算中,您看到了y_pred是:[[7,11][10,16]],您将y_true指定为[[8][9]]。如果我们用y_true和y_pred计算mse的损失
>>> print(tf.keras.losses.mse([[8],[9]], [[[ 7., 11.]], [[10. ,16.]]]).numpy())
[[ 5. 4.]
[34. 25.]]现在,我们有4个值作为损失,2个值用于第一个输入,2个值用于第二个输入。由于计算函数期望每个输入有一个损失,它将第一行的第一个值作为第一个输入的损失值:在[5.,4.]中选择[5.,4.]中的25.作为1的损失,在第二行中为第二个输入选择第二个值:选择25.作为2的损失。现在,如果我们把它们加起来,得到平均值:(25+5)/2=15.0,结果是15。
这种复杂性是由于定义架构和不正确地传递值造成的。
您可以生成更多的示例并比较它们,例如feed 2示例1和2作为输入,并将y_true定义为[6,7]
print("y_true: ", "[[ 6. 7. ]]")
print("y_pred: ", model.predict([1]))
print("loss: ", tf.keras.losses.mse([[6.],[7.]], [model.predict([1])]).numpy())
print()
print("y_true: ", "[[ 6. 7. ]]")
print("y_pred: ", model.predict([2]))
print("loss: ", tf.keras.losses.mse([[6.],[7.]], [model.predict([2])]).numpy())
x = np.array([[1],[2]])
y = np.array([[6],[7]])
model.evaluate(x,y,verbose=2)
print(tf.reduce_mean(tf.keras.losses.mse([[6],[7]], [model.predict([1]), model.predict([2])])).numpy())产出如下:
y_true: [[ 6. 7. ]]
y_pred: [[ 7. 11.]]
loss: [[13. 8.]]
y_true: [[ 6. 7. ]]
y_pred: [[10. 16.]]
loss: [[58. 45.]]
1/1 - 0s - loss: 29.0 #(45+13)/2 = 29.0 what model.evaluate() compute
31.0 #(58+45+13+8)/4 = 31.0 what probably you expecthttps://stackoverflow.com/questions/68418501
复制相似问题